回答
这只是不是在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