PHP访问值使用不区分大小写的索引

时间:2011-03-23 11:47:39

标签: php arrays indexing

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

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

使用$ x ['A'];

访问它的任何函数

9 个答案:

答案 0 :(得分:6)

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

在PHP中, "a""A"是两个不同的字符串
数组键是整数或字符串。

因此,$a["a"]$a["A"]指向数组中的两个不同条目。


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

  • 要么总是使用小写的(或大写)键 - 这可能是最好的解决方案。
  • 或者在所有数组中搜索可能的匹配键,每次要访问一个条目 - 这是一个糟糕的解决方案,因为你必须循环(平均)数组的一半,而不是按键快速访问。


在第一种情况下,每次要访问数组项时都必须使用strtolower()

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

在第二种情况下,像这样的mabe可能会起作用:
(嗯,这是一个未经过测试的想法;但它可能会以你为基础)

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
        }
    }
}

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

答案 1 :(得分: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

答案 2 :(得分: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)];
}

答案 3 :(得分:2)

易。
不要这样做。

模糊自己的代码并不是一个好主意 只需遵循语法规则即可。

答案 4 :(得分:1)

你必须为此编写自己的函数,伪代码:

function getElem(index, array){
  return array[toLower(index)];
}

答案 5 :(得分:1)

$index = "a";

$index = strtoupper($index);

$ret = $a[$index];

答案 6 :(得分: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);
}

答案 7 :(得分:1)

这可能有点晚了,但我认为你想要完成的事情可以轻松完成:

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

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

答案 8 :(得分: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