回答
這只是不是在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
}
}
}
但是,這又是一個糟糕的解決方案!
循環中的「as」前有一個額外的「$」。否則看起來不錯! – 2013-07-26 17:29:50
你必須寫自己的函數,該函數,僞代碼:
function getElem(index, array){
return array[toLower(index)];
}
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)];
}
$index = "a";
$index = strtoupper($index);
$ret = $a[$index];
我會在這裏使用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
我想有人不喜歡我的回答。如果有人能告訴我它有什麼問題,我會很感激。 – 2011-03-23 12:36:21
這個想法是?我的代碼,背後的推理,還是最初的問題?如果它是我的代碼,那麼改進它的可能方法是什麼? – 2011-03-24 08:43:53
原始問題。不要成爲推動者,男人! ;) – Charles 2011-03-24 15:35:50
我想在不改變當前的陣列的用法是這樣的:
$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);
}
簡單。
不要這樣做。
混淆你自己的代碼不是一個好主意。
只要遵循語法規則,你會沒事的。
在這個線程中的人應該遵循這個建議。在任何情況下調用'array_change_key_case'都會導致任何代碼長期存在問題,因爲需要在整個地方添加'strtolower'調用,並且很快它就開始在代碼庫的不相關部分蔓延(可能不區分大小寫)。 – 2017-12-20 08:54:27
這可能是有點晚,但我認爲你所要完成的,可以很容易做的事情:
$key = 'Key';
$array[$key] = 153;
$array = array_change_key_case($array)
echo $array[strtolower($key)];
您可以使用array_change_key_case
改變你的陣列的關鍵情況下,將所有的密鑰,以降低案件或大寫,並讓您安心。
例如:
$headers = getallheaders();
$headers = array_change_key_case($headers, CASE_UPPER);
if (isset($headers['AUTHENTICATION'])) {
// do your thing
}
- 1. PHP/AJAX不區分大小寫搜索
- 2. 使用Hibernate-Search進行不區分大小寫的索引?
- 3. PHP/MySQL的搜索 - 區分大小寫
- 4. 使區分大小寫不敏感的區分大小寫表
- 5. 將PHP區分大小寫不區分搜索到數組
- 6. MySQL - 不區分大小寫的搜索
- 7. MySQL不區分大小寫的搜索?
- 8. 搜索不區分大小寫的
- 9. 不區分大小寫的LDAP搜索
- 10. 不區分大小寫的搜索-xpath
- 11. 不區分大小寫的搜索
- 12. 如何使lucene索引字段不區分大小寫
- 13. PHP不區分大小寫的LTRIM?
- 14. PHP similar_text區分大小寫
- 15. VB.NET不區分大小寫的Web引用計數問題
- 16. PHP的preg_replace:不區分大小寫匹配區分大小寫更換
- 17. PHP數組,數組索引是否區分大小寫?
- 18. 區分大小寫的URL不區分大小寫
- 19. VB.NET不區分大小寫;很好的區分大小寫?
- 20. preg_grep搜索不區分大小寫
- 21. 休眠搜索不區分大小寫
- 22. Hibernate + Postgresql不區分大小寫搜索
- 23. 不區分大小寫陣列搜索
- 24. 搜索不區分大小寫
- 25. SOLR不區分大小寫搜索
- 26. Mysql搜索「我」不區分大小寫
- 27. javascript搜索 - 不區分大小寫
- 28. 彈性搜索不區分大小寫
- 29. Solr不區分大小寫搜索
- 30. 的PHP Zend Lucene的做搜索「不區分重音」,如「不區分大小寫」
$ X =陣列(strtoupper( 'A')=> 'DDD'); $ y = $ x [strtoupper('A')]; – 2011-03-23 11:51:44