array_find() et array_any() font partie des fonctions natives introduites avec PHP 8.4, sorti en novembre 2024. Elles comblent un manque ancien du langage : jusque-là, chercher un élément correspondant à une condition dans un tableau nécessitait une boucle foreach explicite, ou un détour par array_filter() suivi d’une vérification de non-vidité, moins lisible que l’intention réelle du code.
Dans une suite de tests PHPUnit qui vérifie qu’un tableau de résultats contient bien un élément précis, ce genre de boucle manuelle alourdit inutilement une assertion qui devrait rester lisible en une ligne. L’exemple qui suit montre la transformation sur un cas concret : la vérification qu’une commande annulée figure bien dans la liste des commandes retournées par une requête.
Avant : une boucle manuelle dans le test
Voici la forme que prenait ce genre d’assertion avant PHP 8.4, dans un test qui vérifie la présence d’une commande au statut « remboursée » parmi les résultats d’une requête personnalisée :
public function ilInclutLaCommandeRembourseeDansLesResultats(): void
{
$commandes = $this->recupererCommandesDuJour();
$trouvee = null;
foreach ($commandes as $commande) {
if ($commande['statut'] === 'remboursee') {
$trouvee = $commande;
break;
}
}
$this->assertNotNull($trouvee);
$this->assertSame('CMD-2041', $trouvee['reference']);
}
Huit lignes pour exprimer une idée simple : chercher le premier élément correspondant à une condition. La boucle elle-même n’apporte aucune information supplémentaire au lecteur du test, elle ne fait qu’implémenter mécaniquement une recherche.
Après : array_find remplace la boucle

array_find() prend un tableau et une fonction de rappel, et retourne le premier élément pour lequel la fonction retourne vrai, ou null si aucun élément ne correspond :
public function ilInclutLaCommandeRembourseeDansLesResultats(): void
{
$commandes = $this->recupererCommandesDuJour();
$trouvee = array_find(
$commandes,
fn(array $commande): bool => $commande['statut'] === 'remboursee'
);
$this->assertNotNull($trouvee);
$this->assertSame('CMD-2041', $trouvee['reference']);
}
La logique de recherche disparaît du corps du test : il ne reste que la condition recherchée et l’assertion sur le résultat. Le comportement testé n’a pas changé d’un iota, seule la forme du code s’est simplifiée.
array_any pour une simple question de présence
Quand le test n’a pas besoin de récupérer l’élément lui-même, seulement de savoir si au moins un élément correspond à une condition, array_any() convient mieux qu’array_find() suivi d’une comparaison à null :
public function ilSignaleLaPresenceDauMoinsUneCommandeEnLitige(): void
{
$commandes = $this->recupererCommandesDuJour();
$this->assertTrue(
array_any($commandes, fn(array $c): bool => $c['statut'] === 'en_litige')
);
}
Cette forme évite un piège fréquent : comparer un résultat de recherche à null pour en déduire une présence, alors qu’une fonction dédiée exprime directement l’intention booléenne recherchée.
Le symétrique array_all, utile en négatif
PHP 8.4 introduit également array_all(), qui vérifie qu’une condition est vraie pour tous les éléments d’un tableau. Utile pour affirmer par exemple qu’aucune commande du lot ne dépasse un certain délai de traitement, sans écrire de boucle inversée avec un booléen accumulé manuellement.
Ce que ces fonctions ne changent pas
- Elles ne remplacent pas les data providers PHPUnit, qui restent l’outil adapté pour rejouer un test avec plusieurs jeux de données.
- Elles ne dispensent pas de nommer clairement la fonction de rappel quand la condition devient complexe, sous peine de reproduire l’opacité qu’elles cherchent à éviter.
- Elles nécessitent PHP 8.4 au minimum : un projet contraint à une version antérieure devra continuer d’utiliser une boucle ou
array_filter().
Une assertion qui tient en trois lignes se relit en dix secondes ; une boucle de huit lignes se relit en une minute, et se comprend rarement du premier coup.
En résumé
array_find() et array_any(), disponibles depuis PHP 8.4, remplacent avantageusement une boucle manuelle dans une assertion de test portant sur la présence d’un élément dans un tableau. Le gain ne porte pas sur la vitesse d’exécution, négligeable ici, mais sur la lisibilité du test lui-même : huit lignes de boucle se réduisent à un seul appel exprimant directement l’intention de recherche.