检查数组键是否存在,不区分大小写

时间:2017-09-16 17:48:07

标签: php arrays validation string-comparison psr-7

我尝试以 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.

感谢您的帮助。

3 个答案:

答案 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);

值得注意的是,如果你有多个密钥在小写时变得相同(例如,如果你在原始数组中有Foofoo,那么只有数组中的最后一个值将保留。正如它在手册中所读到的那样:" 如果一个数组的索引在运行此函数后会相同(例如" 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);
?>