искать массив php для частичного совпадения строк
существует ли какая-либо предопределенная функция, такая как in_array(), которая выполняет задание , а не выполняет цикл через и сравнивает все значения?
Как вы можете видеть из всех ответов, есть много способов сделать это. Попытайтесь приложить усилия к поиску в Google, прежде чем задавать следующий вопрос 🙂
12 ответов
Для частичного соответствия вы можете перебирать массив и использовать функцию поиска строк, например strpos().
function array_search_partial($arr, $keyword) < foreach($arr as $index =>$string) < if (strpos($string, $keyword) !== FALSE) return $index; >>
Для точного соответствия используйте in_array()
Существует несколько способов.
$arr = array(0 => 'blue', 1 => 'red', 2 => 'green string', 3 => 'red');
Поиск массива с циклом:
$results = array(); foreach ($arr as $value) < if (strpos($value, 'green') !== false) < $results[] = $value; >> if( empty($results) ) < echo 'No matches found.'; >else
Использовать array_filter():
$results = array_filter($arr, function($value) < return strpos($value, 'green') !== false; >);
Чтобы использовать Closures с другими аргументами, существует use -keyword. Таким образом, вы можете абстрагировать его и вложить в функцию:
function find_string_in_array ($arr, $string) < return array_filter($arr, function($value) use ($string) < return strpos($value, $string) !== false; >); > $results = find_string_in_array ($arr, 'green'); if( empty($results) ) < echo 'No matches found.'; >else
для поиска с таким же значением, как sql с «% иглой%», вы можете попробовать
$input = preg_quote('gree', '~'); // don't forget to quote input string! $data = array( 1 => 'orange', 2 => 'green string', 3 => 'green', 4 => 'red', 5 => 'black' ); $result = preg_filter('~' . $input . '~', null, $data);
Вы можете использовать функцию array_search php. Он поддерживается в PHP >= 4.0.5.
$array = array(0 => 'blue', 1 => 'red', 2 => 'green string', 3 => 'red'); $m_array = preg_grep('/^green\s.*/', $array);
$m_array содержит согласованные элементы массива.
array_search() не будет работать, потому что, как и in_array() он ищет только точное совпадение, а не подстроку.
array_walk($arr, function($item, $key) < if(strpos($item, 'green') !== false) < echo 'Found in: ' . $item . ', with key: ' . $key; >>);
function check($string) < foreach($arr as $a) < if(strpos($a,$string) !== false) < return true; >> return false; >
Это функция для обычных или многомерных массивов.
- Дело в чувствительном
- Работает для обычных массивов и многомерных изображений
- Работает при нахождении полных или частичных укусов
Здесь код (версия 1):
function array_find($needle, array $haystack, $column = null) < if(is_array($haystack[0]) === true) < // check for multidimentional array foreach (array_column($haystack, $column) as $key =>$value) < if (strpos(strtolower($value), strtolower($needle)) !== false) < return $key; >> > else < foreach ($haystack as $key =>$value) < // for normal array if (strpos(strtolower($value), strtolower($needle)) !== false) < return $key; >> > return false; >
$multiArray = array( 0 => array( 'name' => 'kevin', 'hobbies' => 'Football / Cricket'), 1 => array( 'name' => 'tom', 'hobbies' => 'tennis'), 2 => array( 'name' => 'alex', 'hobbies' => 'Golf, Softball') ); $singleArray = array( 0 => 'Tennis', 1 => 'Cricket', ); echo "key is - ". array_find('cricket', $singleArray); // returns - key is - 1 echo "key is - ". array_find('cricket', $multiArray, 'hobbies'); // returns - key is - 0
Только для многомерных массивов — $column относится к имени ключа внутри каждого массива. Если $игла появилась более одного раза, я предлагаю добавить к ней, чтобы добавить каждый ключ в массив.
Вот пример, если вы ожидаете нескольких совпадений (версия 2):
function array_find($needle, array $haystack, $column = null) < $keyArray = array(); if(is_array($haystack[0]) === true) < // for multidimentional array foreach (array_column($haystack, $column) as $key =>$value) < if (strpos(strtolower($value), strtolower($needle)) !== false) < $keyArray[] = $key; >> > else < foreach ($haystack as $key =>$value) < // for normal array if (strpos(strtolower($value), strtolower($needle)) !== false) < $keyArray[] = $key; >> > if(empty($keyArray)) < return false; >if(count($keyArray) == 1) < return $keyArray[0]; >else < return $keyArray; >>
Возвращает ключ, если он имеет только одно совпадение, но если в любом столбце $есть несколько совпадений для $-ий, то он вернет массив соответствующих ключей.
msng / strpos_array.php
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
function strpos_array ( $ haystack , $ needles , $ offset = 0 ) |
if (is_array( $ needles )) |
foreach ( $ needles as $ needle ) |
$ pos = strpos_array( $ haystack , $ needle ); |
if ( $ pos !== false ) |
return $ pos ; |
> |
> |
return false ; |
> else |
return strpos( $ haystack , $ needles , $ offset ); |
> |
> |
function strpos_array($haystack, $needles) if ( is_array($needles) ) foreach ($needles as $str) if ( is_array($str) ) $pos = strpos_array($haystack, $str);
> else $pos = strpos($haystack, $str);
>
if ($pos !== FALSE) return $pos;
>
>
> else return strpos($haystack, $needles);
>
>
function strpos_array($haystack, $needles) if ( is_array($needles) ) foreach ($needles as $str) if ( is_array($str) ) $pos = strpos_array($haystack, $str);
> else $pos = strpos($haystack, $str);
>
if ($pos !== FALSE) return $pos;
>
>
> else return strpos($haystack, $needles);
>
>
There’s a bit of an issue here.
Since you have multiple needles, it is possible that the first needle is found, but a later needle is found earlier in the string. The above function does not cover that. The below edit will adjust for it.
However this means returning an array of found needles back. If you want only the position of the first occurrence, do as so:
$cursor = reset( strpos_array( . ) );
If you want all matches for all needles, leave the reset() call out.
function strpos_array($haystack, $needles, $offset = 0) < if (is_array($needles)) < foreach ($needles as $needle) < $found = []; $pos = strpos_array($haystack, $needle); if ($pos !== false) < $found[$needle]=$pos; >> if(!empty($found)) < return asort($found, SORT_NUMERIC); >else < return false; >> return strpos($haystack, $needles, $offset); >
Strpos и массив
Добрый день. В общем, нужно написать небольшой фильтр, но дело в том, что надо возвращение true/false, так что замена слов функцией preg_replace не пройдет, хоть и в нём можно поместить массив.
В общем, захотел использовать strpos, но в документации пишется, что в качестве искомого принимается только строка. И правда — попробовал вместить массив — ошибка. Что же делать? Самому функцию писать?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
if(isset($_POST['submit'])){ $filter = array('лето', 'весна', 'осень', 'марта', 'новый год'); $search = strpos($_POST['text'], $filter); if($search === false){ echo "Не найдено"; }else{ echo "Найдено"; } } ?> form method = "POST"> textarea name = "text">textarea> input type = "submit" name = "submit" value = "Отправить"> form>
strpos()
Пробовал написать функцию для проверки есть ли в названии папки ".". Проверка происходит через.
MySQL: strpos?
Здравствуйте, необходимо стало вести такой поиск по базе, чтобы в определённом столбце было.
Странная обработка StrPos
Привет. Не пойму почему происходит обработка if, если даже "а" равен NULL, судя по Watch List. И.
Аналог функции strpos()
Всем привет. Подскажите как можно заменить функцию php strpos? Сейчас у меня так function.
Сообщение было отмечено L1ke как решение
Решение
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
$_POST['submit'] = 1; $_POST['text'] = 'tom лето =)'; if(isset($_POST['submit'])){ $filter = array('лето', 'весна', 'осень', 'марта', 'новый год'); $search = false; foreach($filter as $f) { if ( strpos($_POST['text'], $f) !== false ) { $search = true; break; } } if($search === false){ echo "Не найдено"; }else{ echo "Найдено"; } } ?> form method = "POST"> textarea name = "text">textarea> input type = "submit" name = "submit" value = "Отправить"> form>
Странная работа ф-и strpos()
Некорректно возвращает позицию подстроки,например <?$object = "Star"; $symbol = "r"; echo "<br.
Реализация функции strpos в winapi
Здравствуйте, роюсь в справке msdn, не могу найти реализацию функции strpos в winapi. Подскажите.
Функция strpos не находит пробел
пишу функцию для ограничения количества слов. выглядит так $count = 0; $vowels = array("\r\n".
Функция strpos не находит вхождения первой буквы
Проблема такая: strpos находит вхождение подстроки только внутри и в конце слова, но в начале -.
Ошибка Warning: strpos() expects parameter 1 to be string, array given in
При работе с сайтом выдает такую ошибку. Warning: strpos() expects parameter 1 to be string.