comparer les propriétés de l'objet et de montrer les diff en PHP
Je suis à la recherche d'un moyen pour me montrer les différentes propriétés/valeurs à partir d'objets donnés...
$obj1 = new StdClass; $obj1->prop = 1;
$obj2 = new StdClass; $obj2->prop = 2;
var_dump(array_diff((array)$obj1, (array)$obj2));
//output array(1) { ["prop"]=> int(1) }
Cela fonctionne très bien aussi longtemps que la propriété n'est pas un objet ou un tableau.
$obj1 = new StdClass; $obj1->prop = array(1,2);
$obj2 = new StdClass; $obj2->prop = array(1,3);
var_dump(array_diff((array)$obj1, (array)$obj2))
//Output array(0) { }
//Expected output - array { ["prop"]=> array { [1]=> int(2) } }
Est-il un moyen de se débarrasser de ce, même lorsque la propriété est un autre objet ?!
Habituellement, vous gérer cela avec une méthode dans la classe, comme un
Oh, et lorsque l'on compare les propriétés contenant des objets, comment pensez-vous que les objets sont égaux ? C'est le genre de récursive question... Vous pouvez vérifier si leurs propriétés sont égaux (récursif problème...) ou si elles sont de la même instance (plus fort que de l'égalité).
le code ci-dessus le montant exact que vous testez? si oui, alors $obj1 et $obj2 prop sont le même tableau(1,2). techniquement il n'y a vraiment aucune différence.
correct, mais array_diff ne parvient toujours pas à produire une profondeur totale de diff, même si elles sont différentes. Voir ma réponse ci-dessous.
un autre problème est que, même si array_diff descend récursivement, pour moi ça ressemble, le type coulée de l'objet de tableau n'..
equals($object)
méthode. Peut-être que vous ne pouvez pas modifier la classe ?Oh, et lorsque l'on compare les propriétés contenant des objets, comment pensez-vous que les objets sont égaux ? C'est le genre de récursive question... Vous pouvez vérifier si leurs propriétés sont égaux (récursif problème...) ou si elles sont de la même instance (plus fort que de l'égalité).
le code ci-dessus le montant exact que vous testez? si oui, alors $obj1 et $obj2 prop sont le même tableau(1,2). techniquement il n'y a vraiment aucune différence.
correct, mais array_diff ne parvient toujours pas à produire une profondeur totale de diff, même si elles sont différentes. Voir ma réponse ci-dessous.
un autre problème est que, même si array_diff descend récursivement, pour moi ça ressemble, le type coulée de l'objet de tableau n'..
OriginalL'auteur nfo | 2011-05-06
Vous devez vous connecter pour publier un commentaire.
Quelque chose comme ce qui suit, qui parcourt et ne récursive de diff est l'élément du tableau est lui-même un tableau pourrait fonctionner:
Des travaux similaires à array_diff, mais il effectue une vérification pour voir si c'est un tableau en premier (is_array) et si oui, met le diff pour que la clé soit la diff pour ce tableau. Répète de manière récursive.
Il travaille ensuite comme ceci:
Dans ce cas, vous pourriez ajouter dans votre boucle de quelque chose qui vérifie si l'objet n'est pas un tableau, si vous pouvez le convertir en l'un et l'exécuter recursive_array_diff sur elle.
Quelque chose comme if (is_array($v)) { ... } elseif (is_array((array) $v) { ... } else { ...} Vous pourriez avoir besoin de vérifier le nombre d'éléments dans la distribution de la matrice de vérifier que vous n'êtes pas accidentellement casting valeurs. Laissez-moi savoir si vous travailler sur quelque chose 🙂
OriginalL'auteur Peter Hamilton