2011-03-23 39 views
1

如何使用不区分大小写索引访问php数组中的值。 像使用不区分大小写索引的PHP访问值

$x = array('a'=>'ddd'); 

任何功能使用$ X [ 'A']来访问它;

+0

$ X =阵列(strtoupper( 'A')=> 'DDD'); $ y = $ x [strtoupper('A')]; – 2011-03-23 11:51:44

回答

6

这只是不是在PHP中的字符串/数组的工作方式。

在PHP中,"a""A"是两个不同的字符串
数组键可以是整数或字符串。因此,$a["a"]$a["A"]指向数组中的两个不同的条目。


你有两种可能的解决方案:

  • 或者总是使用小写(或大写)键 - 这可能是最好的解决方案。
  • 或者在整个阵列中搜索一个可能的匹配键,每次你想访问一个条目 - 这是一个不好的解决方案,因为你必须循环遍历(平均)一半的数组,通过密钥进行快速访问。


在第一种情况下,你将不得不使用strtolower()你想每次访问数组项:

$array[strtolower('KEY')] = 153; 
echo $array[strtolower('KEY')]; 

在第二种情况下,马贝这样的事情可能工作:
(好吧,这是一个不测试的想法,但也可能为您服务为基础)

if (isset($array['key'])) { 
    // use the value -- found by key-access (fast) 
} 
else { 
    // search for the key -- looping over the array (slow) 
    foreach ($array as $upperKey => $value) { 
     if (strtolower($upperKey) == 'key') { 
      // You've found the correct key 
      // => use the value 
     } 
    } 
} 

但是,这又是一个糟糕的解决方案!

+0

循环中的“as”前有一个额外的“$”。否则看起来不错! – 2013-07-26 17:29:50

1

你必须写自己的函数,该函数,伪代码:

function getElem(index, array){ 
    return array[toLower(index)]; 
} 
2
function array_keys_to_lower($array) 
{ 
    $lc_array = array(); 

    foreach ($array as $key => $value) 
    { 
    $lc_array[strtolower($key)] = $value; 
    } 

    return $lc_array; 
} 

function get_value($array, $index) 
{ 
    $lc_array = array_keys_to_lower($array); 

    return $lc_array[strtolower($index)]; 
} 
1
$index = "a"; 

$index = strtoupper($index); 

$ret = $a[$index]; 
4

我会在这里使用OOP,无论是继承自ArrayObject或实现ArrayAcess,然后在偏移方法使用相关的字符串功能匹配任何一种情况。

这是AFAIK 只有方式能够使用$x['A'];语法来访问它。

当然,我在这里没有兴趣在优化速度。您应该确定速度或可读代码是否是您的主要目标。

例子:

class MyArray extends ArrayObject { 
    public function offsetGet($index) { 
     if ($this->offsetExists($index)) { 
      return parent::offsetGet($index); 
     } 
     if ($this->offsetExists(strtolower($index))) { 
      return parent::offsetGet(strtolower($index)); 
     } 
     if ($this->offsetExists(strtoupper($index))) { 
      return parent::offsetGet(strtoupper($index)); 
     } 
     return null; 
    } 

} 

$x = array('a'=>'ddd'); 
$x = new MyArray($x); 
echo $x['A']; 

输出:

ddd 
+0

我想有人不喜欢我的回答。如果有人能告诉我它有什么问题,我会很感激。 – 2011-03-23 12:36:21

+0

这个想法是?我的代码,背后的推理,还是最初的问题?如果它是我的代码,那么改进它的可能方法是什么? – 2011-03-24 08:43:53

+1

原始问题。不要成为推动者,男人! ;) – Charles 2011-03-24 15:35:50

1

我想在不改变当前的阵列的用法是这样的:

$x = array('a'=>'ddd'); 

echo isset($x['a']) ? $x['a'] : $x['A']; 

你可以有这样的功能等以下:

$x = array('a'=>'ddd'); 

echo getIndex($x, 'a'); 

// return either the value of $x['a'], $['A'] or null 
function getIndex($array, $index) { 
    return isset($x[strtolower($index)]) ? $x[strtolower($index)] : (isset($x[strtoupper($index)]) ? $x[strtoupper($index)] : null); 
} 
2

简单。
不要这样做。

混淆你自己的代码不是一个好主意。
只要遵循语法规则,你会没事的。

+0

在这个线程中的人应该遵循这个建议。在任何情况下调用'array_change_key_case'都会导致任何代码长期存在问题,因为需要在整个地方添加'strtolower'调用,并且很快它就开始在代码库的不相关部分蔓延(可能不区分大小写)。 – 2017-12-20 08:54:27

1

这可能是有点晚,但我认为你所要完成的,可以很容易做的事情:

$key = 'Key'; 
$array[$key] = 153; 

$array = array_change_key_case($array) 
echo $array[strtolower($key)]; 
0

您可以使用array_change_key_case改变你的阵列的关键情况下,将所有的密钥,以降低案件或大写,并让您安心。

例如:

$headers = getallheaders(); 
$headers = array_change_key_case($headers, CASE_UPPER); 
    if (isset($headers['AUTHENTICATION'])) { 
     // do your thing 
    } 

http://php.net/manual/en/function.array-change-key-case.php