Я сделал кучу поисков, но не могу понять это.
У меня есть такой массив:
$array = array(cat => 0, dog => 1);
У меня есть такая строка:
I like cats.
Я хочу увидеть, соответствует ли строка каким-либо ключам в массиве. Я пробую следующее, но, очевидно, это не работает.
array_key_exists("I like cats", $array)
Предполагая, что я могу получить любую случайную строку в данный момент, как я могу сделать что-то вроде этого?
Псевдокод:
array_key_exists("I like cats", *.$array.*)
//The value for cat is "0"
Обратите внимание, что я хочу проверить, существует ли «кошка» в любой форме. Это могут быть кошки, Кэти, даже случайные буквы вроде vbncatnm. Я получаю массив из базы данных MySQL, и мне нужно знать, какой идентификатор кошка или собака.
Вы можете использовать регулярные выражения для ключей. Итак, если какие-либо слова вашей строки равны ключу, $found
является true
, Вы можете сохранить $key
в переменной, если хотите. preg_match Функция позволяет проверить регулярное выражение.
$keys = array_keys($array);
$found = false;
foreach ($keys as $key) {
//If the key is found in your string, set $found to true
if (preg_match("/".$key."/", "I like cats")) {
$found = true;
}
}
РЕДАКТИРОВАТЬ :
Как сказано в комментарии, StrPos могло быть лучше! Таким образом, используя тот же код, вы можете просто заменить preg_match:
$keys = array_keys($array);
$found = false;
foreach ($keys as $key) {
//If the key is found in your string, set $found to true
if (false !== strpos("I like cats", $key)) {
$found = true;
}
}
Вы можете использовать preg_match со значением не в массиве, а в критериях поиска
if(preg_match('~(cat|dog)~', "I like cats")) {
echo 'ok';
}
или же
$criteria = '~(cat|dog)~';
if (preg_match($criteria, "I like cats")) {
echo 'ok';
}
В противном случае вы можете использовать foreach в вашем массиве.
foreach($array as $key => $value ) {
$pos = strpos("I like cats", $key);
if ($pos > 0) {
echo $key . ' '. $value;
}
}
Это должно помочь вам достичь того, что вы пытаетесь сделать:
$array = array('cat' => 10, 'dog' => 1);
$findThis = 'I like cats';
$filteredArray = array_filter($array, function($key) use($string){
return strpos($string, $key) !== false;
}, ARRAY_FILTER_USE_KEY);
Я считаю, что использование функции array_filter с функцией замыкания / анонимности является гораздо более элегантным способом, чем цикл foreach, поскольку он поддерживает один уровень отступа.