Поиск строки или ее части в PHP - PullRequest
16 голосов
/ 22 апреля 2011

Я делаю очень маленькое приложение для интернет-магазина на PHP. Итак, у меня есть массив карт на PHP. Я хочу найти строку (продукт) в массиве. Я посмотрел на array_search в PHP, и кажется, что он ищет только точное совпадение. Ребята, вы знаете лучший способ сделать эту функциональность? Так как это очень малая часть того, что я на самом деле делаю, я надеялся, что что-то было встроено. Есть идеи?

Спасибо!

РЕДАКТИРОВАТЬ: Массив содержит «продукты» в этом формате:

[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 предметов, поэтому даже если я использую «медленный» алгоритм, это не займет много времени.

Ответы [ 7 ]

39 голосов
/ 22 апреля 2011

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) use ($needle) {
    return(strpos($haystack, $needle));
});
8 голосов
/ 22 апреля 2011
foreach($array as $item){
  if(strpos($item,"mysearchword")!== false){
    echo 'found';
  }
}

или вы можете использовать preg_match для более гибкого поиска вместо strpos.

1 голос
/ 29 марта 2012

Я думаю, что ответ Марка Б. был хорошей отправной точкой, но для меня у него были некоторые проблемы.Например, вы должны знать, что такое Needle во время «компиляции», потому что вы не можете динамически изменять это значение.Кроме того, если игла появилась в начале элемента строки, она бы действовала так, как будто ее там нет вообще.поэтому после небольшого эксперимента мне удалось найти способ обойти обе проблемы.так что вам не нужно создавать новую функцию для каждой отдельной иглы, которую вы собираетесь использовать больше.

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');

иДоступ к игле теперь доступен в той же области, что и остальная часть кода, вы можете установить иглу на любую другую строковую переменную, которую вы хотите, включая пользовательский ввод.

1 голос
/ 22 апреля 2011

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

Если вы заинтересованы в том, чтобы закатать рукава и немного испачкаться с помощью более сложного решения, я бы попробовал реализацию Zend Lucene (http://framework.zend.com/manual/en/zend.search.lucene.html). Я реализовал поиск на сайте с ним. Это заняло несколько дней, но результаты оказались НАМНОГО лучше, чем 15-минутное решение сопоставления буквенных строк.

Дайте мне знать, если вам нужна дополнительная информация.

Удачи!

PS. Вот пример: http://devzone.zend.com/article/91

0 голосов
/ 17 ноября 2017

У меня такая же проблема, но я создал функцию 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;
}
0 голосов
/ 22 апреля 2011

перебирайте массив и используйте substr, если вы хотите частичное совпадение:

http://php.net/manual/en/function.substr.php

этого должно быть достаточно, если у вас "маленький" магазин ...

0 голосов
/ 22 апреля 2011

Вы можете использовать регулярные выражения для каждого элемента массива, например

foreach($array as $value)
{
    //... your search statement for $value
}
...