3

我尝试以不区分大小写的方式找到正确的方法来检查是否存在数组键。

我有一个数组 - 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.

谢谢您的帮助。

4

3 回答 3

6

您可以使用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);

值得注意的是,如果您有多个键在它们被小写时变得相同(例如,如果您在原始数组中有Foofoo作为键),则只有数组中的最后一个值会保留。正如手册中所述:“如果数组的索引在运行此函数后将相同(例如“keY”和“kEY”),则数组中稍后的值将覆盖其他索引。

于 2017-09-16T17:54:58.723 回答
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);
?>
于 2017-09-16T18:13:31.430 回答
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]))
于 2017-09-16T18:00:31.910 回答