# array_find et array_any en PHP 8.4 : simplifier une assertion sur un tableau

> Deux nouvelles fonctions PHP 8.4 remplacent une boucle manuelle dans une assertion de test. Voici comment les adopter sans complexifier la lecture du test.

- Auteur : WordPress Développement
- Publié le : 2025-01-25
- Mis à jour le : 2025-01-25
- Catégorie : Tests
- URL : https://www.wpmoderne.fr/tests/array-find-array-any-php-8-4-assertion-tableau/

## L’essentiel

- array_find retourne le premier élément correspondant, sans boucle explicite
- array_any répond juste vrai ou faux à une question de présence
- Ces fonctions raccourcissent une assertion sans changer ce qu'elle vérifie

`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

> L'essentiel à retenir : array_find retourne le premier élément correspondant, sans boucle explicite ; array_any répond juste vrai ou faux à une question de présence ; Ces fonctions raccourcissent une assertion sans changer ce qu'elle vérifie

`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.
