php:数组键案例*不敏感*查找?

she*_*iel 66 php arrays

$myArray = array ('SOmeKeyNAme' => 7);  
Run Code Online (Sandbox Code Playgroud)

我想$myArray['somekeyname']回来7.
有没有办法做到这一点,而不操纵数组?

我不创建数组,因此无法控制它的键

Pau*_*xon 78

选项1 - 更改创建阵列的方式

如果没有线性搜索或更改原始数组,则无法执行此操作.最有效的方法是在插入AND时使用strtolower键,当您查找值时.

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

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

 }
Run Code Online (Sandbox Code Playgroud)

如果您保留密钥的原始情况很重要,则可以将其存储为该密钥的附加值,例如

$myArray[strtolower('SOmeKeyNAme')]=array('SOmeKeyNAme', 7);
Run Code Online (Sandbox Code Playgroud)

选项2 - 创建辅助映射

当您更新问题以表明这对您来说不可能时,如何创建一个提供小写和区分大小写版本之间映射的数组?

$keys=array_keys($myArray);
$map=array();
foreach($keys as $key)
{
     $map[strtolower($key)]=$key;
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以使用它来从小写的密钥获取区分大小写的密钥

$test='somekeyname';
if (isset($map[$test]))
{
     $value=$myArray[$map[$test]];
}
Run Code Online (Sandbox Code Playgroud)

这样就无需使用较低的密钥创建数组的完整副本,这实际上是唯一的另一种方法.

选项3 - 创建阵列的副本

如果不考虑制作数组的完整副本,则可以使用array_change_key_case创建具有较低外壳密钥的副本.

$myCopy=array_change_key_case($myArray, CASE_LOWER);
Run Code Online (Sandbox Code Playgroud)

  • 还有[array_change_key_case](http://php.net/manual/en/function.array-change-key-case.php)可以在这里提供帮助. (13认同)
  • 我想知道是否存在直接的方法.我看到它没有.您的答案是解决方法的一种可能性 (4认同)

Sha*_*awn 45

我知道这是一个较旧的问题,但处理这个问题最优雅的方法是使用:

array_change_key_case($myArray); //second parameter is CASE_LOWER by default
Run Code Online (Sandbox Code Playgroud)

在你的例子中:

$myArray = array ('SOmeKeyNAme' => 7);
$myArray = array_change_key_case($myArray);
Run Code Online (Sandbox Code Playgroud)

之后$ myArray将包含所有小写键:

echo $myArray['somekeyname'] will contain 7
Run Code Online (Sandbox Code Playgroud)

或者你可以使用:

array_change_key_case($myArray, CASE_UPPER);
Run Code Online (Sandbox Code Playgroud)

文档可以在这里看到:http://us3.php.net/manual/en/function.array-change-key-case.php


Ken*_*ins 14

您可以使用ArrayAccessinterface创建一个使用数组语法的类.

$lower_array_object = new CaseInsensitiveArray;
$lower_array_object["thisISaKEY"] = "value";
print $lower_array_object["THISisAkey"]; //prints "value"
Run Code Online (Sandbox Code Playgroud)

要么

$lower_array_object = new CaseInsensitiveArray(
    array( "SoMeThInG" => "anything", ... )
);
print $lower_array_object["something"]; //prints "anything"
Run Code Online (Sandbox Code Playgroud)

class CaseInsensitiveArray implements ArrayAccess
{
    private $_container = array();

    public function __construct( Array $initial_array = array() ) {
        $this->_container = array_map( "strtolower", $initial_array );
    }

    public function offsetSet($offset, $value) {
        if( is_string( $offset ) ) $offset = strtolower($offset);
        if (is_null($offset)) {
            $this->container[] = $value;
        } else {
            $this->container[$offset] = $value;
        }
    }

    public function offsetExists($offset) {
        if( is_string( $offset ) ) $offset = strtolower($offset);
        return isset($this->_container[$offset]);
    }

    public function offsetUnset($offset) {
        if( is_string( $offset ) ) $offset = strtolower($offset);
        unset($this->container[$offset]);
    }

    public function offsetGet($offset) {
        if( is_string( $offset ) ) $offset = strtolower($offset);
        return isset($this->container[$offset])
            ? $this->container[$offset]
            : null;
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 13

一种简单但可能很昂贵的方法是制作副本,然后使用array_change_key_case($array_copy, CASE_LOWER),然后再访问array_copy['somekeyname']