json_encode transforme les tableaux (arrays) en objets

Lors d’un développement sous VueJS, l’application présentait des problèmes de filtre (.filter) et de recherche (.find) d’un tableau récupéré en Ajax par vue-resource. Après examen, le tableau n’était plus un array d’objets mais un objet d’objets.

La faute en reviens a une subtilité de json_encode à la frontière du bug: si un tableau a des index discontinus (suite à un filtrage par exemple) celui-ci se trouve encodé en objet d’objets. Or, la fonction filter des collections de Laravel provoquent précisément ce défaut.

La solution c’est l’usage de array_values pour ré-indexer le tableau avant d’en faire un json.

exemple:

$tableau=collect([
    ["prenom"=>"Zoe","age"=>10],
    ["prenom"=>"Robert","age"=>50],
    ["prenom"=>"John","age"=>30]
    ]);

echo json_encode($tableau);
$tableau_filtre=$tableau->filter(function($element){return $element["age"]<40;});
echo json encode($tableau_filtre);

// resolution:
echo json_encode(array_values($tableau_filtre->toArray()));

=> ceci démontre le problème et sa résolution

One comment on “json_encode transforme les tableaux (arrays) en objets

Laisser un commentaire