PHP array delete by value (not key) : plongeons dans les coulisses
\n\nImaginez : vous écrivez un script PHP, vous traitez une liste de produits, et soudain vous devez supprimer un élément du tableau avec un prix ou un nom spécifique. Vous connaissez précisément la valeur — par exemple, "pomme" — mais vous n'avez aucune idée de son index. Une situation familière ? Si oui, vous n'êtes pas seul : la question "PHP array delete by value (not key)" cumule des milliers de vues sur Stack Overflow. Et ce n'est pas un hasard.
PHP n'a pas de fonction native array_remove_by_value(). Les développeurs doivent donc ruser : certains écrivent une boucle, d'autres utilisent array_search avec unset, d'autres encore emploient array_diff ou array_filter. Mais que se passe-t-il en interne ? Quelle méthode est la plus rapide ? Et pourquoi un même code peut-il se comporter différemment selon les versions de PHP ?
Dans cet article, nous ne nous contenterons pas de vous donner une solution toute faite — nous plongerons dans les coulisses de chaque approche, analyserons leurs performances et leurs pièges. Nous vous présenterons également un cas concret tiré de la vie d'un développeur back-end. C'est parti !
\n\nLa méthode classique : array_search + unset
\n\nLa réponse la plus populaire sur Stack Overflow ressemble à ceci :
\n\n<?php\n$array = ['pomme', 'poire', 'orange', 'poire'];\n$value = 'poire';\n\nif (($key = array_search($value, $array)) !== false) {\n unset($array[$key]);\n}\n?>\n\nCe code trouve la première occurrence de la valeur et la supprime. Mais regardons de plus près ce qui se passe réellement.
\n\nComment fonctionne array_search
\n\narray_search() effectue une recherche linéaire. PHP parcourt le tableau du début à la fin, en comparant chaque valeur à celle recherchée. Par défaut, la comparaison est non stricte (==), ce qui signifie que 1 et '1' sont considérés comme égaux. Si vous avez besoin d'une comparaison stricte (===), passez le troisième paramètre true :
<?php\n$array = [0, '0', 1];\n$key = array_search('0', $array, true); // retourne 1 (la chaîne '0'), pas 0\n?>\n\nSi la valeur n'est pas trouvée, la fonction retourne false. La vérification !== false est donc obligatoire — sinon unset($array[0]) supprimerait le premier élément si la valeur se trouvait à la clé 0.
Piège : unset ne réindexe pas le tableau
\n\nAprès unset, le tableau reste associatif — les clés numériques ne sont pas réorganisées. Si vous avez besoin d'un tableau dense avec des index consécutifs, utilisez array_values() :
<?php\n$array = ['pomme', 'poire', 'orange'];\nunset($array[1]);\n$array = array_values($array); // ['pomme', 'orange'] avec les clés 0 et 1\n?>\n\nMais attention : array_values() crée un nouveau tableau, ce qui augmente la consommation mémoire.
Supprimer toutes les occurrences : array_diff
\n\nSi vous devez supprimer tous les éléments ayant une valeur donnée, utiliser array_search dans une boucle n'est pas la meilleure idée. array_diff() est bien plus élégant :
<?php\n$array = ['pomme', 'poire', 'orange', 'poire'];\n$array = array_diff($array, ['poire']);\n// Résultat : ['pomme', 'orange'] (les clés sont conservées)\n?>\n\nCette fonction retourne un nouveau tableau duquel tous les éléments correspondant aux valeurs du second tableau sont supprimés. En interne, PHP utilise une table de hachage pour le second tableau, ce qui rend l'opération en O(n + m), où n est la taille du premier tableau et m celle du second.
\n\nImportant : array_diff compare les valeurs sous forme de chaînes ((string) $elem1 === (string) $elem2). Pour des types mixtes, cela peut donner un résultat inattendu :
<?php\n$array = [0, '0', false];\n$result = array_diff($array, [0]);\n// Résultat :