2011-03-23 38 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