база данных — PHP array_key_exists ключ LIKE строка, это возможно?

Я сделал кучу поисков, но не могу понять это.

У меня есть такой массив:

$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, и мне нужно знать, какой идентификатор кошка или собака.

3

Решение

Вы можете использовать регулярные выражения для ключей. Итак, если какие-либо слова вашей строки равны ключу, $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;
}
}
5

Другие решения

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

}
0

Это должно помочь вам достичь того, что вы пытаетесь сделать:

$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, поскольку он поддерживает один уровень отступа.

0