Поиск строки или части строки в PHP

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

Ответы

Ответ 1

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

Ответ 2

foreach($array as $item){
  if(strpos($item,"mysearchword")!== false){
    echo 'found';
  }
}

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

Ответ 3

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

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

Сообщите мне, если вы хотите получить дополнительную информацию.

Удачи!

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

Ответ 4

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

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

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

Ответ 5

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

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

Ответ 6

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

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

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

Ответ 7

У меня такая же проблема, но я создал функцию я для поиска в массиве, передав массив, ключ и значение.

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;
}