Проверьте, существует ли ключ массива, без учета регистра
Я пытаюсь найти правильный способ проверить, БЕЗ УЧЕТА РЕГИСТРА, существует ли ключ массива.
У меня есть массив - список 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 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
в качестве ключей в исходном массиве), останется только последнее значение в массиве. Как говорится в руководстве: " Если массив имеет индексы, которые будут одинаковыми после выполнения этой функции (например, "Ключ" и "Ключ"), значение, которое находится позже в массиве, переопределит другие индексы."
Создайте массив, обеспечивающий сопоставление версий в нижнем регистре и с учетом регистра
$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]))
Вы можете либо использовать метод 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);
?>