Я делаю очень небольшое приложение интернет-магазина на PHP. Поэтому у меня есть массив карт в PHP. Я хочу найти строку (произведение) в массиве. Я посмотрел на array_search в PHP, и кажется, что он ищет только точное совпадение. Вы, ребята, знаете лучший способ сделать эту функцию? Поскольку это очень небольшая часть того, что я на самом деле делаю, я надеялся, что в нем что-то встроено. Любые идеи?
Благодаря!
EDIT: массив содержит «продукты» в этом формате:
[6] => SimpleXMLElement Object ( [@attributes] => Array ( [id] => 2000-YM ) [Name] => Team Swim School T-Shirt [size] => YM [price] => 15 [group] => Team Clothing [id] => 2000-YM ) [7] => SimpleXMLElement Object ( [@attributes] => Array ( [id] => 3000-YS ) [Name] => Youth Track Jacket [size] => YS [price] => 55 [group] => Team Clothing [id] => 3000-YS )
Поэтому мне было интересно, как я могу выполнить поиск, такой как «Команда», и он вернет мне первый элемент, увиденный здесь. Я основываю поиск по имени (опять-таки это что-то маленькое). Я понимаю, что я могу найти точную строку, я просто застрял на «лучших результатах», если он не может найти точный элемент. Эффективность хорошая, но не требуемая, так как у меня есть только около 50 элементов, поэтому, даже если я использую «медленный» алгоритм, это не займет много времени.
array_filter
позволяет указать пользовательскую функцию для выполнения поиска. В вашем случае простая функция, которая использует strpos()
для проверки наличия вашей строки поиска:
function my_search($haystack) { $needle = 'value to search for'; return(strpos($haystack, $needle)); // or stripos() if you want case-insensitive searching. } $matches = array_filter($your_array, 'my_search');
В качестве альтернативы вы можете использовать анонимную функцию для предотвращения загрязнения пространства имен:
$matches = array_filter($your_array, function ($haystack) { return(strpos($haystack, $needle)); });
foreach($array as $item){ if(strpos($item,"mysearchword")!== false){ echo 'found'; } }
или вы можете использовать preg_match для более гибкого поиска вместо strpos.
К сожалению, поиск – одна из самых сложных вещей в компьютерной науке. Если вы создаете для поиска на основе литеральных совпадений строк или регулярных выражений (регулярное выражение), вы можете обнаружить, что будете недовольны релевантностью возвращаемых результатов.
Если вы заинтересованы в том, чтобы свернуть рукава и немного загрязнить более сложное решение, я бы попробовал реализацию Lucene Lucent ( http://framework.zend.com/manual/en/zend.search.lucene.html ). Я реализовал поиск на сайте с ним. Это заняло несколько дней, но результаты были намного лучше, чем 15-минутное решение литерального сопоставления строк.
Дайте мне знать, если вам нужна дополнительная информация.
Удачи!
PS. Вот пример: http://devzone.zend.com/article/91
Я думаю, что ответ Марка Б был хорошей отправной точкой, но для меня у него были некоторые проблемы. Например, вы должны знать, что Игла находится в «время компиляции», потому что вы не можете динамически изменять это значение. также, если игла появилась в начале элемента строки, она будет действовать так, как будто ее совсем нет. поэтому, после небольшого эксперимента, я столкнулся с проблемой обойти обе проблемы. поэтому вам не нужно создавать новую функцию для каждой другой иглы, которую вы собираетесь использовать больше.
function my_search($haystack) { global $needle; if( strpos($haystack, $needle) === false) {return false;} else {return true;} }
и это было бы названо так:
$needle="item to search for"; $matches = array_filter($my_array, 'my_search');
и теперь, поскольку игла теперь доступна в той же области, что и остальная часть кода, вы можете установить иглу на любую другую строковую переменную, которую вы хотели, включая ввод пользователя.
Вы можете использовать регулярные выражения пользователя для каждого элемента массива, например
foreach($array as $value) { //... your search statement for $value }
итерации через массив и использования substr, если вы хотите частичных совпадений:
http://php.net/manual/en/function.substr.php
это должно быть достаточно, если у вас есть «маленький» магазин …
У меня такая же проблема, но я создал функцию i для поиска в массиве, передав массив, ключ и значение.
public function searchinarr($array, $key, $value) { $results = array(); for($i=0;$i<count($array);$i++) { foreach($array[$i] as $k=>$val) { if($k==$key) { if(strpos($val,$value)!== false) { $results[] = $array[$i]; } } } } return $results; }