現在の位置: ホーム> 最新記事一覧> array_change_key_case()とarray_merge()を組み合わせるときに発生する可能性のある問題

array_change_key_case()とarray_merge()を組み合わせるときに発生する可能性のある問題

M66 2025-05-11

ArrayをPHPで処理する場合、 array_change_key_case()array_merge()はどちらも非常に一般的に使用されています。 1つは配列のキーを均一にケースに変換でき、もう1つはアレイのマージに使用できます。どちらもシンプルで簡単に思えますが、そうであるとき、特にそれらを扱うとき、それらは立ち往生するのが簡単です。

関数の紹介

  • array_change_key_case(array $ array、int $ case = case_lower) :配列のすべてのキー名を小文字または大文字に変換します。

  • array_merge(array ... $ array) :1つ以上の配列をマージします。

ピットポイント分析:キー名は症例に敏感ですが、ケースに敏感です

PHPの配列のキー名は、いくつかの関数で異なる「感度」を示します - たとえば、 array_merge()はケースに敏感ですが、 array_change_key_case()は均一にケースです。これにより、マージ中に「上書きされていないキーの重複」や「予期しない上書き」などの問題につながる可能性があります。

例1:予期しないキーオーバーレイ

$arr1 = ['Name' => 'Alice'];
$arr2 = ['name' => 'Bob'];

$result = array_merge(
    array_change_key_case($arr1, CASE_LOWER),
    array_change_key_case($arr2, CASE_LOWER)
);

print_r($result);

出力:

 Array
(
    [name] => Bob
)

普通に見えますよね?私たちは皆小文字にいるからです。しかし、注文を変更する場合:

 $result = array_merge(
    array_change_key_case($arr2, CASE_LOWER),
    array_change_key_case($arr1, CASE_LOWER)
);

出力:

 Array
(
    [name] => Alice
)

注:カバーされている値は異なります!

これは、 array_merge()array_change_key_case()を使用している場合、処理順序が結果に直接影響することを示しています。

例2:未確認のケースは、最初にキーの重複を引き起こします

$arr1 = ['Name' => 'Alice'];
$arr2 = ['name' => 'Bob'];

$result = array_change_key_case(
    array_merge($arr1, $arr2), CASE_LOWER
);

print_r($result);

出力:

 Array
(
    [name] => Bob
)

この例では、 array_merge()をマージ中に名前名前を2つの異なるキーと見なし、マージ後に小文字になります。そのため、後者のボブは「繰り返されるようですが、実際には両方のキーが存在する」。

そして、あなたの当初の意図は、特定のキーに基づいてマージすることであり、この文章は予期しない行動を引き起こす可能性があります。

推奨される使用法とソリューション

これらの落とし穴を回避するには、これら2つの機能を使用する場合、次のルールに従うことをお勧めします。

  1. 最初にキー名の上限と小文字を統合してからマージします。

     $result = array_merge(
        array_change_key_case($arr1, CASE_LOWER),
        array_change_key_case($arr2, CASE_LOWER)
    );
    
  2. データソース内のキーのケーススタイルが一貫していることを確認してください。データ生成またはソース段階でケース標準を統合することが最善です。

  3. array_merge()の代わりにarray_replace()を使用することを検討してください。いくつかのシナリオでは、 array_replace()は「キーオーバーライド」のロジックに沿っています。

     $result = array_replace(
        array_change_key_case($arr1, CASE_LOWER),
        array_change_key_case($arr2, CASE_LOWER)
    );
    

まとめ

  • array_merge()ケースに敏感です。

  • array_change_key_case()、キー名の上限と小文字を統合するために使用されます。

  • 2つを組み合わせて使用​​すると、シーケンスの順序キーの元のケースが最終結果に影響します。

  • 実際の開発では、データの「偶発的な損失」を避けるために、合併する前にケース変換を行うことを忘れないでください。

この種の落とし穴は、インターフェイス集約( https://api.m66.net/userinfohttps://api.m66.net/userdetailなど)などのマルチシステムまたはマルチソースデータのマージのアプリケーションシナリオで特に発生する傾向があります。事前にケースを処理しない場合は、キーフィールドを知らずに「上書き」することができます。

この記事があなたが落とし穴を避けるのに役立つことを願っています!