Проверьте, существует ли ключ массива, без учета регистра
Я пытаюсь найти правильный способ проверить, 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"), значение, которое будет позже в массиве, будет переопределять другие индексы".
- Живая демо
- PHP.net на
array_change_key_case()
Вы можете использовать метод 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]))