現在の位置: ホーム> 最新記事一覧> array_udiff関数でカスタム比較関数を正しく書き込む方法は?

array_udiff関数でカスタム比較関数を正しく書き込む方法は?

gitbox 2025-08-05

1。array_udiff関数の概要

array_udiff関数は、複数の配列間の違いを計算するために使用されます。 array_diffとの違いは、開発者が要素を比較するカスタム比較関数を提供できることです。この関数の基本的な構文は次のとおりです。

 <span><span><span class="hljs-title function_ invoke__">array_udiff</span></span><span>(</span><span><span class="hljs-keyword">array</span></span><span> </span><span><span class="hljs-variable">$array1</span></span><span>, </span><span><span class="hljs-keyword">array</span></span><span> </span><span><span class="hljs-variable">$array2</span></span><span>, </span><span><span class="hljs-keyword">array</span></span><span> ...</span><span><span class="hljs-variable">$arrays</span></span><span>, </span><span><span class="hljs-keyword">callable</span></span><span> </span><span><span class="hljs-variable">$value_compare_func</span></span><span>): </span><span><span class="hljs-keyword">array</span></span><span>
</span></span>
  • $ array1、$ array2、... $ arrays :比較する1つ以上の配列。

  • $ value_compare_func :2つの配列要素を比較するコールバック関数。この関数は、整数値を返して、要素の順序を示します。

2。カスタム比較関数の要件

カスタム比較関数の関数は、配列要素間の比較ルールを定義することです。通常、2つの配列の要素の2つのパラメーターが必要であり、返された結果に基づいて順序を決定します。関数の比較は、次のルールに従う必要があります。

  • 最初のパラメーターが2番目のパラメーターよりも小さい場合、負の値が返されます。

  • 最初のパラメーターが2番目のパラメーターに等しい場合、ゼロを返します。

  • 最初のパラメーターが2番目のパラメーターよりも大きい場合、正の値が返されます。

PHPは、カスタム比較関数の戻り値に基づいて、結果アレイにどの要素が保持されるかを決定します。

3.カスタム比較関数を書き込みます

カスタム比較関数の実装は比較的簡単です。これが基本的なカスタム比較関数の例です。

 <span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">compare_values</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$a</span></span></span><span>, </span><span><span class="hljs-variable">$b</span></span><span>) {
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$a</span></span><span> === </span><span><span class="hljs-variable">$b</span></span><span>) {
        </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-number">0</span></span><span>; </span><span><span class="hljs-comment">// 等しい</span></span><span>
    }
    </span><span><span class="hljs-keyword">return</span></span><span> (</span><span><span class="hljs-variable">$a</span></span><span> &lt; </span><span><span class="hljs-variable">$b</span></span><span>) ? -</span><span><span class="hljs-number">1</span></span><span> : </span><span><span class="hljs-number">1</span></span><span>; </span><span><span class="hljs-comment">// ネガティブよりも少ない,リターンプラス数よりも大きい</span></span><span>
}
</span></span>

この比較関数は数値のものであり、文字列またはより複雑なデータ型を比較する場合は、実際のニーズに応じてそれらを変更する必要がある場合があります。

4.カスタム比較関数をarray_udiffに使用します

array_udiffでは、カスタム比較関数を使用することは非常に簡単です。最後のパラメーターとして渡すだけです。たとえば、2つの配列間の違いを比較してください。

 <span><span><span class="hljs-variable">$array1</span></span><span> = [</span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-number">3</span></span><span>, </span><span><span class="hljs-number">4</span></span><span>];
</span><span><span class="hljs-variable">$array2</span></span><span> = [</span><span><span class="hljs-number">3</span></span><span>, </span><span><span class="hljs-number">4</span></span><span>, </span><span><span class="hljs-number">5</span></span><span>, </span><span><span class="hljs-number">6</span></span><span>];

</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_udiff</span></span><span>(</span><span><span class="hljs-variable">$array1</span></span><span>, </span><span><span class="hljs-variable">$array2</span></span><span>, </span><span><span class="hljs-string">"compare_values"</span></span><span>);

</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$result</span></span><span>);
</span></span>

出力の結果は次のとおりです。

 <span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
(
    [</span><span><span class="hljs-number">0</span></span><span>] =&gt; </span><span><span class="hljs-number">1</span></span><span>
    [</span><span><span class="hljs-number">1</span></span><span>] =&gt; </span><span><span class="hljs-number">2</span></span><span>
)
</span></span>

ご覧のとおり、配列$ array1$ array2の違い要素は12であり、 $ array2ではありません。

5。複数の配列の比較

Array_udiffは、2つの配列を比較するだけでなく、複数の配列間の違いを比較できます。より多くの配列を渡すだけで、PHPは指定された順序で1つずつ比較します。

たとえば、3つの配列の違いを比較してください。

 <span><span><span class="hljs-variable">$array1</span></span><span> = [</span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-number">3</span></span><span>, </span><span><span class="hljs-number">4</span></span><span>];
</span><span><span class="hljs-variable">$array2</span></span><span> = [</span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-number">3</span></span><span>, </span><span><span class="hljs-number">5</span></span><span>];
</span><span><span class="hljs-variable">$array3</span></span><span> = [</span><span><span class="hljs-number">3</span></span><span>, </span><span><span class="hljs-number">6</span></span><span>];

</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_udiff</span></span><span>(</span><span><span class="hljs-variable">$array1</span></span><span>, </span><span><span class="hljs-variable">$array2</span></span><span>, </span><span><span class="hljs-variable">$array3</span></span><span>, </span><span><span class="hljs-string">"compare_values"</span></span><span>);

</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$result</span></span><span>);
</span></span>

出力の結果は次のとおりです。

 <span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
(
    [</span><span><span class="hljs-number">0</span></span><span>] =&gt; </span><span><span class="hljs-number">1</span></span><span>
    [</span><span><span class="hljs-number">3</span></span><span>] =&gt; </span><span><span class="hljs-number">4</span></span><span>
)
</span></span>

6。文字列または複雑なデータ型の比較

文字列または複雑なデータ構造を比較する必要がある場合は、それに応じて比較関数も調整する必要があります。たとえば、2つの文字列のサイズを比較する場合、 STRCMP関数を使用できます。

 <span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">compare_strings</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$a</span></span></span><span>, </span><span><span class="hljs-variable">$b</span></span><span>) {
    </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">strcmp</span></span><span>(</span><span><span class="hljs-variable">$a</span></span><span>, </span><span><span class="hljs-variable">$b</span></span><span>);
}

</span><span><span class="hljs-variable">$array1</span></span><span> = [</span><span><span class="hljs-string">"apple"</span></span><span>, </span><span><span class="hljs-string">"banana"</span></span><span>, </span><span><span class="hljs-string">"cherry"</span></span><span>];
</span><span><span class="hljs-variable">$array2</span></span><span> = [</span><span><span class="hljs-string">"banana"</span></span><span>, </span><span><span class="hljs-string">"cherry"</span></span><span>, </span><span><span class="hljs-string">"date"</span></span><span>];

</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_udiff</span></span><span>(</span><span><span class="hljs-variable">$array1</span></span><span>, </span><span><span class="hljs-variable">$array2</span></span><span>, </span><span><span class="hljs-string">"compare_strings"</span></span><span>);

</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$result</span></span><span>);
</span></span>

出力の結果は次のとおりです。

 <span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
(
    [</span><span><span class="hljs-number">0</span></span><span>] =&gt; apple
)
</span></span>

7.閉鎖を比較関数として使用します

PHPでは、閉鎖(匿名関数)も一般的な使用法であり、 array_udiffの比較関数として使用できます。これにより、名前付き関数を個別に定義する必要はありません。たとえば、次のコードは、閉鎖を使用して2つの整数配列間の違いを比較する方法を示しています。

 <span><span><span class="hljs-variable">$array1</span></span><span> = [</span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-number">3</span></span><span>, </span><span><span class="hljs-number">4</span></span><span>];
</span><span><span class="hljs-variable">$array2</span></span><span> = [</span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-number">3</span></span><span>, </span><span><span class="hljs-number">5</span></span><span>];

</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_udiff</span></span><span>(</span><span><span class="hljs-variable">$array1</span></span><span>, </span><span><span class="hljs-variable">$array2</span></span><span>, function(</span><span><span class="hljs-variable">$a</span></span><span>, </span><span><span class="hljs-variable">$b</span></span><span>) {
    </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$a</span></span><span> - </span><span><span class="hljs-variable">$b</span></span><span>; </span><span><span class="hljs-comment">// 数値サイズの簡単な比較</span></span><span>
});

</span><span><span class="hljs-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$result</span></span><span>);
</span></span>

出力の結果は次のとおりです。

 <span><span><span class="hljs-title function_ invoke__">Array</span></span><span>
(
    [</span><span><span class="hljs-number">0</span></span><span>] =&gt; </span><span><span class="hljs-number">1</span></span><span>
    [</span><span><span class="hljs-number">3</span></span><span>] =&gt; </span><span><span class="hljs-number">4</span></span><span>
)
</span></span>

8。パフォーマンスの最適化

Array_udiffのパフォーマンスは、非常に大きな配列を扱うときに問題になる可能性があります。 array_udiffは、要素によって要素と呼ばれるカスタム比較関数を必要とするため、パフォーマンスの最適化が特に重要になります。比較機能を作成するときは、不必要な計算や複雑なロジックを避け、比較機能を簡潔かつ効率的に保ちます。

結論は

array_udiffとカスタム比較関数を使用することにより、複数の配列間の違いを柔軟に計算できます。重要なのは、比較関数がどのように機能するかを正しく理解し、異なるデータ型に従って比較ルールを調整することです。数字、文字列、複雑なデータ構造であろうと、カスタム比較機能は、開発者により高い制御を提供できます。うまくいけば、この記事の説明を通して、 Array_udiff関数をPHPで使用して配列の違いを処理する方法をよりよく理解できることを願っています。