Formater un tableau pour CURLOPT_POSTFIELDS

Envoyer un array en POST avec cURL

23 mars 2017

Le tableau de paramètres que l'on doit passer dans l'option CURLOPT_POSTFIELDS de cURL a un format particulier pour les paramètres qui sont eux-mêmes des tableaux.

Contrairement à la fonction PHP http_build_query qui travaille directement avec des tableaux associatifs, pour cURL le tableau doit être aplati et chaque clé doit contenir le nom complet du paramètre comme il apparaîtrait dans une query string.

Formater les postfields pour cURL

function convertForCurlPostfields($to_convert, $parent_node_name = null) {

        if (is_object($to_convert)) {
                /* Transformation d'un objet en tableau */
                $to_convert = get_object_vars($to_convert);
        }

        $converted = [];

        foreach ($to_convert as $current_node_name => $value) {

                if (isset($parent_node_name)) {
                        /* Si nous sommes dans un appel récursif, le premier appel a transmis le nom du noeud parent. */
                        $current_node_name = $parent_node_name . '[' . $current_node_name . ']';
                }

                if (is_array($value) || is_object($value)) {
                        /* Rappelle cette fonction si la valeur est elle même un tableau ou un objet. */
                        $converted = array_merge($converted, convertForCurlPostfields($value, $current_node_name));
                } else {
                        $converted[$current_node_name] = $value;
                }
        }

        return $converted;
}

var_dump(convertForCurlPostfields(
        [
                'a' => 1,
                'b' => 2,
                'c' => [
                        'd' => 3,
                        'e' => [
                                'f' => 4,
                                'g' => 5
                        ]
                ],
                'h' => 42
        ]
));

/* Résultat :
 * array(6) {
 *  ["a"]=>
 *  int(1)
 *  ["b"]=>
 *  int(2)
 *  ["c[d]"]=>
 *  int(3)
 *  ["c[e][f]"]=>
 *  int(4)
 *  ["c[e][g]"]=>
 *  int(5)
 *  ["h"]=>
 *  int(42)
 * }
 */

A bientôt !

Par
Créateur et administrateur.

Dans la même catégorie

Email avec pièce jointe en PHP
PHP : modifier les attributs privés d'un objet
Tester l'existence d'un fichier dans l'include path
Convertir récursivement un objet PHP en tableau
PHP : formater un tableau en CSV
Comment envoyer un mail en ligne de commande ?
RSYNC : Comment synchroniser des fichiers à travers une connexion ssh ?
Exécuter un code PHP en ligne de commande
Doctrine 2 : générer les classes PHP depuis la base de données
Comment catcher les erreurs en PHP ?
Doctrine 2 : comment afficher la requête SQL ?
Comment construire une URL sans caractères spéciaux en PHP ?
Comment lister les fichiers PHP inclus sur ma page ?
Les fonctions anonymes récursives en PHP
Requête HTTP asynchrone en PHP
La résolution statique à la volée ou Late Static Bindings
Trouver les jours fériés français en PHP
Comment allumer son ordinateur à distance en PHP ?
Comment utiliser la balise meta viewport ?
Une version mobile de mon site avec le Zend Framework
Doctrine et le Zend Framework : Présentation, intégration et utilisation
Créer son flux RSS simplement avec Zend_Feed
Appliquer un layout sur un mail avec le Zend Framework
Comment lancer une requête multi-bases avec les fonctions MySQL ?
Implode / Explode : Du tableau à la chaine de caractères, de la chaine de caractères au tableau

Commentaire(s)