PHP Как проверить, содержит ли массив шаблон из другого массива

Я ищу альтернативную функцию, которая работает так же, как in_array, но которая также может проверить, содержит ли поисковый термин только часть данного элемента вместо всего элемента:

В данный момент работаю со следующим скриптом:

$attributes = array('dogs', 'cats', 'fish');

if (in_array($attributes, array('dog','cats','fishess'), true )) {

* does something for cats, but not for dogs and fish
because the function only checks if the given term is identical to the word in the array instead of only a part of the word *
}

Как мне построить свою функцию так, чтобы она передавала слова, которые содержат только части слова в массиве?

Предпочитаемый пример будет выглядеть примерно так:

$words = array('fish', 'sharks');

if (*word or sentence part is* in_array($words, array('fishing', 'sharkskin')){

return 'your result matched 2 elements in the array $words

}

0

Решение

Решение с использованием array_filter а также preg_grep функции:

$words = ['fish', 'sharks', 'cats', 'dogs'];
$others = ['fishing', 'sharkskin'];

$matched_words = array_filter($words, function($w) use($others){
return preg_grep("/" . $w . "/", $others);
});

print_r($matched_words);

Выход:

Array
(
[0] => fish
[1] => sharks
)
1

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

Попробуйте код ниже:

<?php
$what  = ['fish', 'sharks'];
$where = ['fishing', 'sharkskin'];

foreach($what as $one)
foreach($where as $other)
echo (strpos($other, $one)!==false ? "YEP! ".$one." is in ".$other."<br>" : $one." isn't in ".$other."<br>");
?>

Надеюсь, это поможет =}

1

Почему бы просто не сделать свой собственный кусок кода / функции?

foreach ($item in $attributes) {
foreach ($item2 in array('dog','cats','fishess')) {
// Check your custom functionality.
// Do something if needed.
}
}

Вы можете взглянуть на array_intersect, но он не собирается проверять совпадения с образцом (о чем вы как-то упоминали?)

array_intersect () возвращает массив, содержащий все значения array1, присутствующие во всех аргументах. Обратите внимание, что ключи сохранены.

foreach (array_intersects($attributes, array('dog','cats','fishess') {
// do something.
}
0

ты можешь использовать:

array_filter($arr, function($v, $k) {
// do whatever condition you want
return in_array($v, $somearray);
}, ARRAY_FILTER_USE_BOTH);

вызов этой функции для каждого элемента в массиве $arr функция, которую вы можете настроить, в вашем случае проверьте, добавляете ли вы элемент в другой массив или нет

0

Я бы пошел с:

 $patterns = array('/.*fish.*/', '/.*sharks.*/');
$subjects = array('fishing', 'aaaaa', 'sharkskin');
$matches = array();
preg_replace_callback(
$patterns,
function ($m) {
global $matches;
$matches[] =  $m[0];
return $m[0];
},
$subjects
);

print_r($matches); // Array ( [0] => fishing [1] => sharkskin )
0
По вопросам рекламы [email protected]