Récemment, pour les besoins d’un projet, je me suis heurté à un problème concernant les tableaux associatifs : comment déterminer si certaines clés vérifient une expression régulière (ou regex) ? La réponse est en fait assez simple, mais il faut simplement savoir où chercher.

Checkbox

Que veut-on faire ?

Imaginons un exemple simple : on envoie un formulaire par POST. Dans ce formulaire sont contenues diverses cases à cocher, permettant de sélectionner, par exemple, des objets identifiés par un ID. Ces cases à cocher ont donc un nom comme « objet_42 » où 42 est l’ID de l’objet en question.

Vérifier qu’une case est cochée, côté serveur, est très simple : si la variable existe, c’est que la case est cochée. Par exemple, on peut tester que l’objet identifié par l’ID 42 est sélectionné avec ça :

Pas très dur jusque-là. Mais les choses se compliquent si on ne sait pas à l’avance quels objets seront présents dans la liste des choix. Ou tout simplement si on veut récupérer tous les objets sélectionnés sans trop se prendre la tête avec une multitude de conditions à rallonge.

Nous avons nommé nos cases à cocher intelligemment : chaque nom respecte en fait l’expression régulière suivante :

^objet_[0-9]+$

et ça ne va pas chercher plus loin. L’idéal serait donc de rechercher dans l’array $_POST les variables vérifiant cette expression. Manque de bol, la recherche est à effectuer du côté des clés de l’array $_POST.

La solution

J’ai bien évidemment en premier lieu tourné ma recherche vers la doc pour vérifier si une fonction native permettait ceci directement. Il y a en bien une, proche, mais qui ne fait pas tout à fait ce qu’on veut : preg_grep.

La fonction preg_grep attend au minimum deux arguments, le premier étant une expression régulière et le second étant un array. Elle va alors analyser toutes les valeurs contenues dans l’array en question et retourner un nouvel array ne contenant que les valeurs vérifiant l’expression. Et tout le problème est là : preg_grep analyse les valeurs et non pas les clés comme on le voulait.

Fort heureusement, il existe une fonction permettant de récupérer toutes les clés d’un array pour ensuite les stocker dans un nouvel array : array_keys.

En premier lieu, nous allons donc extraire les clés de notre array. Pour illustrer ceci, j’ai repris l’exemple des données POST.

Ce n’est plus compliqué que ça : $cles est un array numéroté dont les valeurs sont en fait les clés de l’array $_POST, soit toutes les variables envoyées par le formulaire. Ce qu’on voulait, donc.

Ensuite, eh bien il suffit de faire la recherche :

La variable $objets est alors parfaite : c’est exactement ce qu’on voulait dès le début.

Aller plus loin

On a un array contenant les objets sélectionnés, mais avec des valeurs comme « objet_292« . C’est bien, mais que faire si on ne veut que les ID ? Ce serait plus simple à gérer s’il n’y avait pas ce préfixe « objet_« . Fort heureusement, ce préfixe a un avantage : il est constant et c’est donc le même pour tous les objets.

Autrement dit, on peut créer une fonction qui va extraire l’ID à partir d’une chaîne de ce genre, par exemple :

Cette fonction est simple : on lui donne un nom du type « objet_12 » et elle nous renvoie l’entier 12. Reste maintenant à l’appliquer à toutes les valeurs de notre array. Et vous savez quoi ? PHP nous fournit une fonction spécialement pour ça : array_map !

L’array $ids contient donc tous les ID des objets sélectionnés, et rien d’autre, mission accomplie.

Si vous souhaitez simplement savoir s’il y a des clés qui respectent une expression régulière (s’il y a des objets sélectionnés dans notre cas), c’est encore plus simple : comptez le nombre de valeurs dans l’array $objets.

Facile, non ?