php: Array keys case *insensitive* lookup?

前端 未结 12 1982
予麋鹿
予麋鹿 2020-12-25 10:30
$myArray = array (\'SOmeKeyNAme\' => 7);  

I want $myArray[\'somekeyname\'] to return 7.
Is there a way to do this

12条回答
  •  星月不相逢
    2020-12-25 11:20

    Option 1 - change the way you create the array

    You can't do this without either a linear search or altering the original array. The most efficient approach will be to use strtolower on keys when you insert AND when you lookup values.

     $myArray[strtolower('SOmeKeyNAme')]=7;
    
     if (isset($myArray[strtolower('SomekeyName')]))
     {
    
     }
    

    If it's important to you to preserve the original case of the key, you could store it as a additional value for that key, e.g.

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

    Option 2 - create a secondary mapping

    As you updated the question to suggest this wouldn't be possible for you, how about you create an array providing a mapping between lowercased and case-sensitive versions?

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

    Now you can use this to obtain the case-sensitive key from a lowercased one

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

    This avoids the need to create a full copy of the array with a lower-cased key, which is really the only other way to go about this.

    Option 3 - Create a copy of the array

    If making a full copy of the array isn't a concern, then you can use array_change_key_case to create a copy with lower cased keys.

    $myCopy=array_change_key_case($myArray, CASE_LOWER);
    

提交回复
热议问题