1. ホーム
  2. php

php: Array keys case *insensitive* lookup?

2023-08-14 17:40:07

質問

$myArray = array ('SOmeKeyNAme' => 7);  

私は $myArray['somekeyname'] を返すように 7 .

配列を操作せずに、これを行う方法はありますか?

配列を作成しないので、キーを制御することができません。

どのように解決するのですか?

オプション 1 - 配列を作成する方法を変更する

線形探索を行うか、元の配列を変更することなく、これを行うことはできません。最も効率的な方法は strtolower を使うことです。

 $myArray[strtolower('SOmeKeyNAme')]=7;

 if (isset($myArray[strtolower('SomekeyName')]))
 {

 }

キーのオリジナルのケースを保持することが重要な場合、そのキーの追加値として保存することができます。例えば、以下のようになります。

$myArray[strtolower('SOmeKeyNAme')]=array('SOmeKeyNAme', 7);

オプション 2 - セカンダリーマッピングを作成する

質問を更新して、これがあなたにとって不可能であることを示唆したので、小文字と大文字を区別するバージョン間のマッピングを提供する配列を作成するのはどうでしょうか?

$keys=array_keys($myArray);
$map=array();
foreach($keys as $key)
{
     $map[strtolower($key)]=$key;
}

これで小文字のキーから大文字小文字を区別するキーを取得することができます

$test='somekeyname';
if (isset($map[$test]))
{
     $value=$myArray[$map[$test]];
}

これにより、小文字のキーを持つ配列の完全なコピーを作成する必要性を回避できます。

オプション 3 - 配列のコピーを作成する

配列の完全なコピーを作ることが気にならないのであれば array_change_key_case を使用して、小文字のキーを持つコピーを作成することができます。

$myCopy=array_change_key_case($myArray, CASE_LOWER);