PHPでは、さまざまな配列関数を使用してデータ、特にarray_intersect_ukey()を処理することがよくあります。これは、2つ以上の配列のキー名とそれらの間に同じキー名を持つ要素を返すために使用されます。この関数は使用するのに非常に便利ですが、カスタム比較方法を使用してキー名が同じかどうかを判断する場合、 array_interect_ukey()関数はやや制限されます。したがって、キー名の比較関数をカスタマイズしてarray_intersect_ukey()に適用する方法のマスタリングは、配列処理機能を大幅に強化します。
まず、 array_intersect_ukey()の基本的な使用を理解することが非常に重要です。この関数の構文は次のとおりです。
<span><span><span class="hljs-title function_ invoke__">array_intersect_ukey</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">callable</span></span><span> </span><span><span class="hljs-variable">$key_compare_func</span></span><span>): </span><span><span class="hljs-keyword">array</span></span><span>
</span></span>
$ array1および$ array2 :比較する2つの配列。
$ key_compare_func :2つのキー名を比較するコールバック関数。返品値が0未満の場合、最初のキーは2番目のキーよりも小さくなります。返品値が0より大きい場合、最初のキーは2番目のキーよりも大きくなります。 0が返されると、2つのキーが等しくなります。
たとえば、次のコードは、 array_intersect_ukey()の一般的な使用法を示しています。
<span><span><span class="hljs-variable">$array1</span></span><span> = [</span><span><span class="hljs-string">'a'</span></span><span> => </span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-string">'b'</span></span><span> => </span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-string">'c'</span></span><span> => </span><span><span class="hljs-number">3</span></span><span>];
</span><span><span class="hljs-variable">$array2</span></span><span> = [</span><span><span class="hljs-string">'b'</span></span><span> => </span><span><span class="hljs-number">4</span></span><span>, </span><span><span class="hljs-string">'c'</span></span><span> => </span><span><span class="hljs-number">5</span></span><span>, </span><span><span class="hljs-string">'d'</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_intersect_ukey</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">'strcasecmp'</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>
(
[b] => </span><span><span class="hljs-number">2</span></span><span>
[c] => </span><span><span class="hljs-number">3</span></span><span>
)
</span></span>
この例では、 STRCASECMPはコールバック関数として使用され、キー名のケース比較を無視し、最終的に2つの配列に同じキー名を持つ要素を返します。
実際のアプリケーションでは、ニーズに応じて、より複雑な比較機能を設計する必要があることがよくあります。 PHPを使用すると、比較ロジックを細かく制御できるように、カスタム比較関数を渡すことができます。
たとえば、文字ケースだけでなく特殊文字の優先度も考慮して、配列のキー名を比較したい場合は、これを達成するための関数をカスタマイズできます。
<span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">custom_key_compare</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$key1</span></span></span><span>, </span><span><span class="hljs-variable">$key2</span></span><span>) {
</span><span><span class="hljs-comment">// カスタム比較ロジック:キー名に特殊文字が含まれている場合,優先度が高い</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">strpos</span></span><span>(</span><span><span class="hljs-variable">$key1</span></span><span>, </span><span><span class="hljs-string">'@'</span></span><span>) !== </span><span><span class="hljs-literal">false</span></span><span> && </span><span><span class="hljs-title function_ invoke__">strpos</span></span><span>(</span><span><span class="hljs-variable">$key2</span></span><span>, </span><span><span class="hljs-string">'@'</span></span><span>) === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">return</span></span><span> -</span><span><span class="hljs-number">1</span></span><span>; </span><span><span class="hljs-comment">// $key1 優先度</span></span><span>
} </span><span><span class="hljs-keyword">elseif</span></span><span> (</span><span><span class="hljs-title function_ invoke__">strpos</span></span><span>(</span><span><span class="hljs-variable">$key2</span></span><span>, </span><span><span class="hljs-string">'@'</span></span><span>) !== </span><span><span class="hljs-literal">false</span></span><span> && </span><span><span class="hljs-title function_ invoke__">strpos</span></span><span>(</span><span><span class="hljs-variable">$key1</span></span><span>, </span><span><span class="hljs-string">'@'</span></span><span>) === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-number">1</span></span><span>; </span><span><span class="hljs-comment">// $key2 優先度</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-title function_ invoke__">strcmp</span></span><span>(</span><span><span class="hljs-variable">$key1</span></span><span>, </span><span><span class="hljs-variable">$key2</span></span><span>);
}
</span></span>
この例では、 custom_key_compare()関数が最初にキー名に@シンボルが含まれているかどうかを決定します。 1つが含まれていて、もう1つが含まれていない場合、 @を含むキー名が優先されます。それ以外の場合は、アルファベット順に比較されます。
次に、 custom_key_compare()関数をarray_intersect_ukey()に適用して、キー名の比較を実行できます。次の2つの配列があるとします。
<span><span><span class="hljs-variable">$array1</span></span><span> = [</span><span><span class="hljs-string">'a'</span></span><span> => </span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-string">'b@'</span></span><span> => </span><span><span class="hljs-number">2</span></span><span>, </span><span><span class="hljs-string">'c'</span></span><span> => </span><span><span class="hljs-number">3</span></span><span>];
</span><span><span class="hljs-variable">$array2</span></span><span> = [</span><span><span class="hljs-string">'b'</span></span><span> => </span><span><span class="hljs-number">4</span></span><span>, </span><span><span class="hljs-string">'c'</span></span><span> => </span><span><span class="hljs-number">5</span></span><span>, </span><span><span class="hljs-string">'d'</span></span><span> => </span><span><span class="hljs-number">6</span></span><span>, </span><span><span class="hljs-string">'b@'</span></span><span> => </span><span><span class="hljs-number">7</span></span><span>];
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_intersect_ukey</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">'custom_key_compare'</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>
(
[b@] => </span><span><span class="hljs-number">2</span></span><span>
)
</span></span>
ご覧のとおり、 array_intersect_ukey()は、カスタマイズされたキー名の比較関数に従ってキー名B@を正常に認識しますが、Arrayに同じ値がある場合でも、 Bを無視します。
キー名の比較関数をカスタマイズすることにより、多くの複雑なシナリオを柔軟に処理できます。たとえば、ファイルパスで作業しているときにケースを無視したり、パス内のスラッシュ方向(フォワードスラッシュ/およびバックスラッシュ\ )を何らかの形式に統合したい場合、 array_intersect_ukey()もカスタムルールに基づいて簡単に比較できます。
次のファイルパス配列があるとします。
<span><span><span class="hljs-variable">$array1</span></span><span> = [</span><span><span class="hljs-string">'src/main.php'</span></span><span> => </span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-string">'src/config/config.php'</span></span><span> => </span><span><span class="hljs-number">2</span></span><span>];
</span><span><span class="hljs-variable">$array2</span></span><span> = [</span><span><span class="hljs-string">'SRC/main.php'</span></span><span> => </span><span><span class="hljs-number">3</span></span><span>, </span><span><span class="hljs-string">'src/config/config.php'</span></span><span> => </span><span><span class="hljs-number">4</span></span><span>];
</span></span>
ケースを無視し、パスのスラッシュ方向を統一したいと考えています。比較機能を次のようにカスタマイズできます。
<span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">path_compare</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$key1</span></span></span><span>, </span><span><span class="hljs-variable">$key2</span></span><span>) {
</span><span><span class="hljs-comment">// パスをフォワードスラッシュに変換し、ケースを無視します</span></span><span>
</span><span><span class="hljs-variable">$key1</span></span><span> = </span><span><span class="hljs-title function_ invoke__">str_replace</span></span><span>(</span><span><span class="hljs-string">'\\'</span></span><span>, </span><span><span class="hljs-string">'/'</span></span><span>, </span><span><span class="hljs-title function_ invoke__">strtolower</span></span><span>(</span><span><span class="hljs-variable">$key1</span></span><span>));
</span><span><span class="hljs-variable">$key2</span></span><span> = </span><span><span class="hljs-title function_ invoke__">str_replace</span></span><span>(</span><span><span class="hljs-string">'\\'</span></span><span>, </span><span><span class="hljs-string">'/'</span></span><span>, </span><span><span class="hljs-title function_ invoke__">strtolower</span></span><span>(</span><span><span class="hljs-variable">$key2</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">$key1</span></span><span>, </span><span><span class="hljs-variable">$key2</span></span><span>);
}
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_intersect_ukey</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">'path_compare'</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>
(
[src/config/config.php] => </span><span><span class="hljs-number">2</span></span><span>
)
</span></span>
カスタム比較関数を通じて、パスの場合の違いとスラッシュ方向の違いを無視し、正しい結果を得ました。
Array_intersect_ukey()関数を介して、カスタムキー名の比較関数と組み合わせて、PHPは、配列内のキー名の比較を処理するための柔軟で効率的な方法を提供します。単純なアルファベット順の比較であろうと、複雑な特別規則の判断であろうと、カスタム比較関数を通じて達成できます。これにより、複雑なデータを処理する際に強力なツールが提供されます。これにより、アレイ操作の動作をより正確に制御できます。