Проверьте, существует ли ключ массива, без учета регистра


Я пытаюсь найти правильный способ проверить, БЕЗ УЧЕТА РЕГИСТРА, существует ли ключ массива.

У меня есть массив - список 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.

Спасибо за вашу помощь.

Author: Qirel, 2017-09-16

3 answers

Вы можете использовать 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 в качестве ключей в исходном массиве), останется только последнее значение в массиве. Как говорится в руководстве: " Если массив имеет индексы, которые будут одинаковыми после выполнения этой функции (например, "Ключ" и "Ключ"), значение, которое находится позже в массиве, переопределит другие индексы."

 3
Author: Qirel, 2017-09-16 18:00:01

Создайте массив, обеспечивающий сопоставление версий в нижнем регистре и с учетом регистра

$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]))
 0
Author: Sachila Ranawaka, 2017-09-16 18:00:31

Вы можете либо использовать метод 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);
?>
 0
Author: Sumit Parakh, 2017-09-16 18:13:31