$myArray = array ('SOmeKeyNAme' => 7);
Run Code Online (Sandbox Code Playgroud)
我想$myArray['somekeyname']
回来7
.
有没有办法做到这一点,而不操纵数组?
我不创建数组,因此无法控制它的键
Pau*_*xon 78
如果没有线性搜索或更改原始数组,则无法执行此操作.最有效的方法是在插入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)
当您更新问题以表明这对您来说不可能时,如何创建一个提供小写和区分大小写版本之间映射的数组?
$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)
这样就无需使用较低的密钥创建数组的完整副本,这实际上是唯一的另一种方法.
如果不考虑制作数组的完整副本,则可以使用array_change_key_case创建具有较低外壳密钥的副本.
$myCopy=array_change_key_case($myArray, CASE_LOWER);
Run Code Online (Sandbox Code Playgroud)
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
您可以使用ArrayAccess
interface创建一个使用数组语法的类.
例
$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']