Si vous êtes ici, vous savez probablement déjà que la fonction array_map ne permet pas d'accéder aux clés du tableau dans le rappel. Avoir la clé autre que la valeur peut être extrêmement utile pour traiter des tableaux associatifs (tableaux avec des clés de chaîne).
Je vais vous montrer mon cas d'utilisation de cette solution et la nouvelle fonction que j'ai implémentée.
Pour des articles plus techniques vous pouvez me suivre sur Linkedin ou X.
Un cas d'utilisation réel courant de la fonction PHP array_map consiste à transformer les données d'une requête de base de données ou d'une réponse API. Par exemple, supposons que vous disposiez d'un tableau de données utilisateur et que vous souhaitiez formater les noms des utilisateurs ou extraire une information spécifique de chaque enregistrement utilisateur.
Imaginez que vous ayez un tableau d'enregistrements d'utilisateurs, et chaque enregistrement est un tableau associatif avec des clés telles que prénom, nom de famille et e-mail :
// Array of user data (e.g., from a database query) $users = [ [ 'first_name' => 'John', 'last_name' => 'Doe', 'email' => 'john.doe@example.com' ], [ 'first_name' => 'Jane', 'last_name' => 'Smith', 'email' => 'jane.smith@example.com' ], [ 'first_name' => 'Bob', 'last_name' => 'Johnson', 'email' => 'bob.johnson@example.com' ] ];
Vous pouvez facilement extraire la liste des adresses e-mail auxquelles envoyer une notification :
$emails = array_map(function($user) { return $user['email']; }, $users); // Result: ['john.doe@example.com', 'jane.smith@example.com', 'bob.johnson@example.com']
Vous pouvez utiliser la fonction array_map pour ajouter de nouveaux champs à l'objet utilisateur en fonction de leurs informations :
// Using array_map to add the avatar field to each user $result = array_map(function($user) { return array_merge( $user, [ 'avatar' => 'https://eu.ui-avatars.com/api/?background=ff7511&color=fff&name='.$user['first_name'] ] ); }, $users); // Output the result var_dump($result);
J'ai réalisé une extraction de données à partir d'une base de données NoSQL pour créer un graphique sur mon tableau de bord produit. Les données que je reçois de la base de données NoSQL ressemblent à ceci :
$data = [ "2024-08-25" => ["doc_count" => 523, "score" => 0.2, "skipped" => 0], "2024-08-24" => ["doc_count" => 423, "score" => 0.2, "skipped" => 0], "2024-08-23" => ["doc_count" => 453, "score" => 0.2, "skipped" => 0], "2024-08-22" => ["doc_count" => 267, "score" => 0.2, "skipped" => 0], "2024-08-21" => ["doc_count" => 378, "score" => 0.2, "skipped" => 0], "2024-08-20" => ["doc_count" => 325, "score" => 0.2, "skipped" => 0], "2024-08-19" => ["doc_count" => 501, "score" => 0.2, "skipped" => 0], ];
En raison de la bibliothèque javascript utilisée pour visualiser les graphiques, je dois transformer ces données dans le format ci-dessous pour faciliter la vie du développeur frontend :
$result = [ [ "label" => "2024-08-25", "value" => 523 ], [ "label" => "2024-08-24", "value" => 423 ], ... ];
Mais pour effectuer cette transformation j'ai besoin d'accéder à la clé du tableau d'origine pour la mettre dans le champ "label". Mais la fonction array_map par défaut permet uniquement d'accéder à la valeur.
Voici une implémentation de la fonction array_map_assoc qui fonctionne avec des tableaux associatifs. Il fournit à la fois la clé et la valeur comme arguments du rappel :
/** * Apply a mapping callback receiving key and value as arguments. * The standard array_map doesn't pass the key to the callback. But in the case of associative arrays, * it could be really helpful. * * array_map_assoc(function ($key, $value) { * ... * }, $items) * * @param callable $callback * @param array $array * @return array */ function array_map_assoc(callable $callback, array $array): array { return array_map(function($key) use ($callback, $array){ return $callback($key, $array[$key]); }, array_keys($array)); }
Maintenant, je peux transformer le tableau utilisateur d'origine au format de données pour la bibliothèque de graphiques javascript :
$histogram = array_map_assoc(function ($key, $value) { return [ 'label' => $key, 'value' => $value['doc_count'] ]; }, $data);
Attention car la fonction array_map_assoc ne préserve pas l'état des clés de chaîne, mais elle génère un tout nouveau tableau standard.
J'ai également ajouté cette fonction dans l'espace de noms global de mon application Laravel en tant que nouvelle fonction d'assistance :
https://inspector.dev/laravel-custom-helper-functions-fast-tips/
Les développeurs plus expérimentés pensent peut-être que vous pouvez accéder à la clé et à la valeur simplement en utilisant une instruction foreach :
foreach ($data as $date => $value) { ... }
En utilisant foreach, vous devez utiliser une variable supplémentaire pour enregistrer la transformation résultante et vous ne pouvez pas structurer le code dans une instruction « sur une seule ligne ».
// Array of user data (e.g., from a database query) $users = [ [ 'first_name' => 'John', 'last_name' => 'Doe', 'email' => 'john.doe@example.com' ], [ 'first_name' => 'Jane', 'last_name' => 'Smith', 'email' => 'jane.smith@example.com' ], [ 'first_name' => 'Bob', 'last_name' => 'Johnson', 'email' => 'bob.johnson@example.com' ] ];
Pour des articles plus techniques vous pouvez me suivre sur Linkedin ou X.
Inspector est un outil de surveillance de l'exécution de code spécialement conçu pour les développeurs de logiciels. Vous n'avez pas besoin d'installer quoi que ce soit au niveau du serveur, installez simplement le package Laravel ou Symfony et vous êtes prêt à partir.
Si vous recherchez une surveillance HTTP, des informations sur les requêtes de base de données et la possibilité de transférer des alertes et des notifications vers votre environnement de messagerie préféré, essayez Inspector gratuitement. Enregistrez votre compte.
Ou apprenez-en plus sur le site : https://inspector.dev
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!