我尝试以 CASE-INSENSITIVE 方式检查是否存在数组密钥的正确方法。
我有一个数组 - 一个HTTP标头列表:
$headers = [
'User-Agent' => 'Mozilla',
];
基本上,我希望能够提供这样的东西(小字符'u'):
$keyExists = array_key_exists('user-Agent', $headers);
并在应用true
时收到布尔var_dump
:
var_dump($keyExists); // I need TRUE to be returned.
感谢您的帮助。
答案 0 :(得分:4)
您可以使用array_change_key_case()
将所有案例转换为较低的案例,并检查array_key_exists()
中的小写字母键。 array_change_key_case()
默认情况下将所有键更改为小写(但您也可以通过将CASE_UPPER
提供给第二个参数将其更改为大写 - CASE_LOWER
是默认值。)
这当然意味着当您将密钥传递给array_key_exists()
的第一个参数时,您要查找的密钥必须小写。您传递变量,您可以使用strtolower()
来确保变量。
$headers = array(
'User-Agent' => 'Mozilla',
);
$headers = array_change_key_case($headers); // Convert all keys to lower
$keyExists = array_key_exists('user-agent', $headers);
var_dump($keyExists);
值得注意的是,如果你有多个密钥在小写时变得相同(例如,如果你在原始数组中有Foo
和foo
,那么只有数组中的最后一个值将保留。正如它在手册中所读到的那样:" 如果一个数组的索引在运行此函数后会相同(例如" keY"和" kEY"),稍后在数组中的值将覆盖其他索引。"
答案 1 :(得分:0)
创建一个数组,提供小写和区分大小写的版本之间的映射
$headers = array(
'User-Agent' => 'Mozilla',
);
$keys=array_keys($headers);
$map=array();
foreach($keys as $key)
{
$map[strtolower($key)]=$key;
}
$name=strtolower('user-Agent');
var_dump(isset($map[$name]))
答案 2 :(得分:0)
您可以使用array_change_key_case方法(有点贵)将所有键转换为小写,然后进行比较。或者为它编写自己的函数。
<?php
function lowerCase($header,$compareKey){
foreach ($header as $key => $value) {
if(strtolower($key)==strtolower($compareKey)){
return true;
}
}
return false;
}
$headers = array(
'User-Agent' => 'Mozilla',
);
$keyExists = array_key_exists(strtolower('user-Agent'), array_change_key_case($headers,CASE_LOWER));
var_dump($keyExists);
$keyExists2 = lowerCase($headers,'user-Agent');
var_dump($keyExists2);
?>