Je retourne un json_encode() d'un tableau d'objets tirés d'un ORM. Il inclut beaucoup de propriétés avec une valeur nulle. Quelle est la meilleure façon de supprimer ces propriétés qui sont null? Je suppose que je pourrais itérer sur les propriétés, regardez si elles sont nulles, puis unset() cette propriété, mais sûrement il doit y avoir une manière plus élégante?Toute fonction PHP qui dépouillera les propriétés d'un objet null?
Répondre
Essayez ceci; ça ne marchera que sur un objet simple, mais si ça vient d'un ORM, ça devrait être assez simple.
// Strips any false-y values
$object = (object) array_filter((array) $object);
Merci à Gordon's réponse à une autre question hier pour me donner l'idée.
Cela fonctionne par
- convertir l'objet à un tableau associatif, où les propriétés d'objets sont les clés et leurs valeurs sont le tableau des valeurs
- en utilisant array_filter avec des arguments par défaut pour supprimer les entrées de tableau avec un faux (par exemple vide ou null) valeurs
- convertissant le nouveau tableau arrière à un simple objet
Notez que cela supprimera tous les prop des valeurs avec des valeurs vides, y compris des chaînes vides, des valeurs booléennes fausses et des 0, pas seulement des valeurs nulles; vous pouvez changer l'appel array_filter si vous voulez garder ceux-ci et seulement ceux qui sont exactement null.
// Strips only null values
$object = (object) array_filter((array) $object, function ($val) {
return !is_null($val);
});
Il n'y a pas de fonction standard pour supprimer les propriétés NULL. Ecrire l'un des vôtres n'est pas inélégant, si vous en écrivez élégamment.
Malgré le nom que vous pouvez également utiliser array_walk
avec une fermeture:
// Setup
$obj = (object) array('foo' => NULL, 'bar' => 'baz');
// equivalent to array_filter
array_walk($obj, function($v,$k) use ($obj) {
if(empty($v)) unset($obj->$k);
});
// output
print_r($obj);
Sortie
stdClass Object
(
[foo] => bar
)
Je vais ajouter à la réponse donnée par El Yobo parce que la volonté ne fonctionne que si vous avez un objet ou un tableau en 1 dimension. Si un tableau ou un objet est imbriqué, pour que la solution acceptée fonctionne, vous devez créer une sorte de filtre de tableau récursif. Pas bon.
La meilleure solution que mon collègue et moi avons trouvée était d'effectuer une expression régulière sur la chaîne JSON avant qu'elle ne soit renvoyée par le serveur.
$json = json_encode($complexObject);
echo preg_replace('/,\s*"[^"]+":null|"[^"]+":null,?/', '', $json);
L'expression régulière supprimera tous les endroits dans la chaîne de la forme ,"key":null
y compris les espaces entre la virgule avant et le début de la clé. Il fera également correspondre "key": null, ensuite pour s'assurer qu'aucune valeur nulle n'a été trouvée au début d'un objet JSON.
Ce n'est évidemment pas la situation la plus idéale, mais elle supprimera efficacement les entrées nulles sans avoir à développer un type de filtre de tableau récursif.
En réponse à la réponse de @Gordon, quelques ajustements seraient nécessaires pour que cela fonctionne, mais vous pouvez également utiliser array_walk_recursive à la place. La référence est obligatoire ou toute modification apportée à l'objet ne s'appliquera pas à la portée en dehors de la fermeture.
IE:
$someObject = (array)$someObject;
array_walk_recursive($someObject, function($v,$k) use (&$someObject) {
if($someObject[$k] == null) {
unset($someObject[$k]);
}
});
$someObject = (object)$someObject;
var_dump($someObject);
Impressionnant! Cela a fonctionné parfaitement. Merci beaucoup. Je ne suis pas sûr de comment ça fonctionne, mais c'est un truc très bien. – Darren
J'y ajouterai également une explication :) –
Ajout d'une explication, avec quelques mises en garde - vous perdrez également des propriétés avec des valeurs telles que '' et 0. L'argument array_filter peut être modifié si vous souhaitez conserver ceux. –