現在の位置: ホーム> 最新記事一覧> array_diff_ukeyとarray_mapを組み合わせて、phpに複雑な配列キー比較を実装する方法

array_diff_ukeyとarray_mapを組み合わせて、phpに複雑な配列キー比較を実装する方法

gitbox 2025-09-08

<span><span><span class="hljs-meta"><?php</span></span><span> </span><span><span class="hljs-comment">// 本文将探讨在 PHP 中如何结合 array_diff_ukey 和 array_map 来实现更复杂的数组键比较场景。</span></span><span> </span><span><span class="hljs-comment">// array_diff_ukey 提供了自定义键比较的能力,而 array_map 则可以帮助我们对数据进行预处理,</span></span><span> </span><span><span class="hljs-comment">// 两者结合能够解决一些仅靠单一函数无法处理的问题。</span></span><span> </span><span><span class="hljs-comment">// --------------------------------------------</span></span><span> 在 PHP 的数组操作中,常见的函数如 `array_diff`、`array_diff_assoc`、`array_diff_key` 都提供了 对数组值或键的差集比较功能。然而,当我们需要在 **键的比较逻辑上引入自定义规则** 时, `array_diff_ukey` 就显得非常有用。它允许开发者传入一个用户自定义的回调函数,来决定两个键 在比较时的先后关系。 例如,假设我们有两个数组: ```php </span><span><span class="hljs-variable">$array1</span></span><span> = [ </span><span><span class="hljs-string">"User_01"</span></span><span> => </span><span><span class="hljs-string">"Alice"</span></span><span>, </span><span><span class="hljs-string">"User_02"</span></span><span> => </span><span><span class="hljs-string">"Bob"</span></span><span>, </span><span><span class="hljs-string">"User_03"</span></span><span> => </span><span><span class="hljs-string">"Charlie"</span></span><span> ]; </span><span><span class="hljs-variable">$array2</span></span><span> = [ </span><span><span class="hljs-string">"user_1"</span></span><span> => </span><span><span class="hljs-string">"Alice"</span></span><span>, </span><span><span class="hljs-string">"user_4"</span></span><span> => </span><span><span class="hljs-string">"David"</span></span><span> ]; </span></span>

デフォルトでは、 array_diff_ukeyは「user_01」「user_1」の類似性を認識していません。
ビジネスロジックが比較する必要がある場合、私たちは結合する必要があります
前処理のためのarray_map

キーの正規化にはarray_mapを使用します

array_maparray_keysを使用して、配列キーで「標準化」プロセスを実行し、それらを統合形式に変換し、次に比較できます。

 <span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">normalizeKey</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$key</span></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__">strtolower</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-variable">$key</span></span><span>));
}

</span><span><span class="hljs-variable">$normalized1</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_combine</span></span><span>(
    </span><span><span class="hljs-title function_ invoke__">array_map</span></span><span>(</span><span><span class="hljs-string">"normalizeKey"</span></span><span>, </span><span><span class="hljs-title function_ invoke__">array_keys</span></span><span>(</span><span><span class="hljs-variable">$array1</span></span><span>)),
    </span><span><span class="hljs-title function_ invoke__">array_values</span></span><span>(</span><span><span class="hljs-variable">$array1</span></span><span>)
);

</span><span><span class="hljs-variable">$normalized2</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_combine</span></span><span>(
    </span><span><span class="hljs-title function_ invoke__">array_map</span></span><span>(</span><span><span class="hljs-string">"normalizeKey"</span></span><span>, </span><span><span class="hljs-title function_ invoke__">array_keys</span></span><span>(</span><span><span class="hljs-variable">$array2</span></span><span>)),
    </span><span><span class="hljs-title function_ invoke__">array_values</span></span><span>(</span><span><span class="hljs-variable">$array2</span></span><span>)
);
</span></span>

この時点で、 $ remarized1$ remarized2のキーは、「アンダースコアなしで小文字」に均一に変換されています。

array_diff_ukeyを組み合わせて複雑な比較を実現します

次に、 array_diff_ukeyを使用して比較できます。

 <span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_diff_ukey</span></span><span>(</span><span><span class="hljs-variable">$normalized1</span></span><span>, </span><span><span class="hljs-variable">$normalized2</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-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-title function_ invoke__">print_r</span></span><span>(</span><span><span class="hljs-variable">$result</span></span><span>);
</span></span>

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

 <span><span>Array
(
    [</span><span><span class="hljs-meta">user02</span></span><span>] =&gt; Bob
    [</span><span><span class="hljs-meta">user03</span></span><span>] =&gt; Charlie
)
</span></span>

ご覧のように、 user_01user_1は同じキーとして認識されているため、差は除外されます。

要約します

array_mapのキー標準化array_diff_ukeyのカスタムキー比較を組み合わせて、
ケースを無視したり、特定の文字を削除したり、部分的な一致を実装するなど、より複雑なキーマッチングロジックを処理することができます。
このアプローチは、外部のデータソース(API戻り値、ユーザーがデータをアップロードするなど)を処理する場合に特に役立ちます。これらのデータのキーは、常に統合された形式ではないことが多いためです。

この柔軟な関数の組み合わせのアイデアは、コードの保守性を改善するだけでなく、変更可能なデータ構造に迅速に適応するのにも役立ちます。

 <span></span>