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()は均一にケースです。これにより、マージ中に「上書きされていないキーの重複」や「予期しない上書き」などの問題につながる可能性があります。
$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()を使用している場合、処理順序が結果に直接影響することを示しています。
$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つの機能を使用する場合、次のルールに従うことをお勧めします。
最初にキー名の上限と小文字を統合してからマージします。
$result = array_merge(
array_change_key_case($arr1, CASE_LOWER),
array_change_key_case($arr2, CASE_LOWER)
);
データソース内のキーのケーススタイルが一貫していることを確認してください。データ生成またはソース段階でケース標準を統合することが最善です。
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/userinfoやhttps://api.m66.net/userdetailなど)などのマルチシステムまたはマルチソースデータのマージのアプリケーションシナリオで特に発生する傾向があります。事前にケースを処理しない場合は、キーフィールドを知らずに「上書き」することができます。
この記事があなたが落とし穴を避けるのに役立つことを願っています!