web-dev-qa-db-fra.com

Rechercher une chaîne ou une partie de chaîne dans PHP

Je fais une très petite application de magasin en ligne en PHP. J'ai donc un tableau de cartes en PHP. Je veux rechercher une chaîne (un produit) dans le tableau. J'ai regardé array_search dans PHP et il semble qu'il ne recherche que la correspondance exacte. Savez-vous une meilleure façon de faire cette fonctionnalité? Puisqu'il s'agit d'une très petite partie de ce que je suis en train de faire, j'espérais qu'il y avait quelque chose d'intégré. Des idées?

Merci!

EDIT: Le tableau contient des "produits" dans ce format:

[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
    )

Alors je me demandais si je pouvais faire une recherche telle que "Équipe" et elle me retournerait le premier élément vu ici. Je base la recherche sur le nom (encore une fois, c'est juste quelque chose de petit). Je comprends que je peux trouver la chaîne exacte, je suis juste coincé sur les "meilleurs résultats" s’il ne parvient pas à trouver le produit exact. L'efficacité est agréable mais non requise, car je n'ai qu'une cinquantaine d'éléments, donc même si j'utilise un algorithme "lent", cela ne prendra pas beaucoup de temps. 

16
Sahir

array_filter vous permet de spécifier une fonction personnalisée pour effectuer la recherche. Dans votre cas, une fonction simple qui utilise strpos() pour vérifier si votre chaîne de recherche est présente:

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

Vous pouvez également utiliser une fonction anonyme pour aider à prévenir la contamination par un espace de noms:

$matches = array_filter($your_array, function ($haystack) use ($needle) {
    return(strpos($haystack, $needle));
});
39
Marc B
foreach($array as $item){
  if(strpos($item,"mysearchword")!== false){
    echo 'found';
  }
}

ou vous pouvez utiliser preg_match pour une recherche plus flexible au lieu de strpos.

8
Headshota

Malheureusement, la recherche est l’une des choses les plus difficiles à faire en informatique. Si vous créez une recherche basée sur des correspondances de chaînes littérales ou des expressions régulières (regex), vous constaterez peut-être que vous ne serez pas satisfait de la pertinence des résultats renvoyés.

Si vous souhaitez relever le défi et vous salir avec une solution plus sophistiquée, je pourrais essayer la mise en œuvre de Zend dans Lucene ( http://framework.zend.com/manual/fr/zend.search.lucene .html ). J'ai implémenté une recherche sur un site. Cela a pris quelques jours, mais les résultats étaient BEAUCOUP meilleurs que ceux de la solution de 15 minutes de correspondance de chaîne littérale.

Faites-moi savoir si vous souhaitez plus d'informations.

Bonne chance! 

PS Voici un exemple: http://devzone.zend.com/article/91

1
Homer6

Je pense que la réponse de Marc B était un bon point de départ, mais pour moi, cela posait quelques problèmes. Comme vous devez savoir ce qu'est l'Aiguille au "moment de la compilation", car vous ne pouvez pas modifier cette valeur de manière dynamique. de même, si l'aiguille apparaissait au début de l'élément string, elle agirait comme si elle n'y était pas du tout. donc après un peu d'expérimentation, j'ai réussi à trouver un moyen de contourner les deux problèmes. vous n'avez donc plus besoin de créer une nouvelle fonction pour chaque aiguille que vous souhaitez utiliser.

function my_search($haystack)
{
    global $needle;
    if( strpos($haystack, $needle) === false) {return false;} else {return true;}
}

et ça s'appellerait comme ça:

$needle="item to search for";
$matches = array_filter($my_array, 'my_search');

et être en tant qu’aiguille est maintenant accessible dans la même portée que le reste du code, vous pouvez définir aiguille sur toute autre variable de chaîne de votre choix, y compris la saisie de l’utilisateur.

1
Kit Ramos

Vous pouvez utiliser des expressions régulières sur chaque élément du tableau, comme

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

parcourez le tableau et utilisez substr si vous voulez des correspondances partielles: 

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

cela devrait suffire si vous avez un "petit" magasin ...

0
sdolgy