PHP : Rechercher si une partie d’une chaine existe dans un tableau

Il est très facile de trouver une valeur d’un tableau en PHP, car le langage de programmation nous propose tout ce qu’il faut. En effet, lorsque vous commencez à concevoir des programmes et applications un peu plus complexes, il est tout à fait normal de devoir manipuler des tableaux. D’ailleurs, si vous êtes débutants dans la programmation, je vous conseille de bien vous familiariser avec eux. Vous risquez de voir beaucoup de tableaux et ceci avec de nombreux langages de programmation différents.

Il est donc très facile de trouver une valeur dans un tableau en PHP, mais cela ne réagira peut-être tel que vous le pensiez. Comme je vous le disais, il y a déjà une très bonne base dans PHP avec la fonction : in_array(). Cette fonction fonctionne très bien, pas de soucis. Elle est très utile pour chercher une valeur dans un tableau de nombres, de mots ou paramètres simples tel un false par exemple. Par exemple, ici, on voit que la fonction nous renvoie la bonne réponse attendue :

<?php

$lang = array("php", "python", "go", "rust", 'javascript');
if (in_array("rust", $lang)) {
    echo "Rust est bien dans mon tableau";
}

?>

La fonction va bien nous renvoyer :

Rust est bien dans mon tableau

Mais que se passe-t-il si on cherche maintenant à trouver une occurrence d’une chaîne, tel qu’un mot qui serait présent dans une phrase ? Regardons ce qu’il se passe si on exécute la même fonction, mais avec notre nouveau besoin :

<?php

$text = array(
"une phrase random", 
"zonetuto.fr est un super site", 
"j'aime le php"
);

if (in_array("php", $text)) {
    echo "J'ai trouvé le mot php";
} else {
    echo "Aucun élément du tableau avec php"; 
}


?>

On obtient alors la réponse :

Aucun élément du tableau avec php

Mince, ce n’est pas ce que l’on attendait ! En réalité le comportement de la fonction in_array() de PHP est tout à fait normal et cohérent avec sa documentation. La valeur de cet élément du tableau est bien « j’aime le php » et pas « php » donc elle nous renvoie un false. Rassurez-vous, j’ai une solution toute simple que vous allez pouvoir mettre dans votre collection de fonctions.

Chercher si une occurrence d’une chaine est présente dans une autre chaine contenu dans un tableau

Maintenant, on va reprendre le même tableau, mais cette fois, on va faire une petite boucle sur notre tableau et utiliser la fonction strpos(). Notre fonction va d’abord parcourir le tableau renseigné en paramètre d’entrée. Puis elle va chercher si une partie de la chaîne est présente ou pas dans la chaîne courante du tableau. Cela peut sembler très simple, mais j’ai déjà expliqué ce concept à des étudiants débutants alors je me suis dit autant en faire un article pour tous !

La fonction qui nous permet de chercher si une chaine est présente dans un tableau est donc la suivante :

<?php

function InArrayZoneTuto($search, $tableau){
    foreach($tableau as $element){
        if(strpos($element, $search)) {
            return true;
        }
    }
    return false;
}

?>

$search est donc le mot ou l’occurrence que l’on cherche à trouver dans le tableau. $tableau est notre tableau de données et on va réutiliser $text mentionné plus haut. Si la chaine est trouvé on fait donc directement un return true car il est inutile dans notre exemple de parcourir la suite du tableau. Selon la taille de votre tableau et ce que vous cherchez réellement à faire, cela peut avoir une importance niveau performance et temps d’exécution.

Si on teste notre nouvelle super fonction avec le tableau $text au début de cet article, on obtient alors les résultats suivants :

<?php

var_dump(InArrayZoneTuto('toto',$text)); // false
var_dump(InArrayZoneTuto('php',$text)); // true
var_dump(InArrayZoneTuto('.fr',$text)); //true
}

?>

Personnellement, quand j’ai fait cette fonction pour la première fois, c’était pour trouver que des noms de domaine avec .fr dans un tableau qui avait des milliers de lignes. J’espère que ce petit tutoriel vous aidera bien dans la découverte de PHP.

3 réflexions au sujet de “PHP : Rechercher si une partie d’une chaine existe dans un tableau”

  1. Comment obtenir un tableau avec les chaînes contenant la recherche en une seule ligne ?

    array_filter($text,function($value) use ($search){ if (strpos($value,$search)!==false){return $value;} })

    un $search=’fr’ donnera array(1) { [1]=> string(29) « zonetuto.fr est un super site » }

    Enjoy ^^

    Répondre
  2. Bonjour,

    Il faut rajouter !==false dans le test de strpos() : en effet, strpos() peut retourné 0 si la chaine commence par la valeur recherche (position 1 de la chaine). Sans le !==false, cette valeur 0 sera considéré comme un « false ».

    function InArrayZoneTuto($search, $tableau){
    foreach($tableau as $element){
    if(strpos($element, $search)!==false) {
    return true;
    }
    }
    return false;

    Répondre

Laisser un commentaire