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

Я пытаюсь найти правильный способ проверить, 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 ответа

Решение

Ты можешь использовать 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"), значение, которое будет позже в массиве, будет переопределять другие индексы".

Вы можете использовать метод 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);
?>

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

$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]))
Другие вопросы по тегам