„Array-zu-String-Konvertierungsfehler“ beim Aufrufen von array_diff_assoc() mit einem mehrdimensionalen Array
Lesezeit: 7 Minuten
Benutzer2963765
Ich erhalte einen Array-zu-String-Konvertierungsfehler für die folgende Zeile:
$diff = array_diff_assoc($stockist, $arr);
Hier, $arr ist ein aus einer JSON-Datei decodiertes Array. Verwendung der is_array() Funktion konnte ich überprüfen, ob beide Parameter Arrays sind. Kann mir jemand das Problem zeigen
“Beide Parameter sind Arrays” Sicher sind sie, und php sagt nichts anderes. Das Problem ist ein Array-zu-String-Konvertierung, nicht umgekehrt. Die Frage ist, was diese Arrays tun enthalten.
– Geomagen
7. November 2013 um 8:03 Uhr
@viakondratiuk Ja, es ist mehrdimensional. Aber wertet array_diff() nicht nur die erste Ebene aus
– Benutzer2963765
7. November 2013 um 8:09 Uhr
@user2963765 Diese Funktion überprüft nur eine Dimension eines n-dimensionalen Arrays. Natürlich können Sie tiefere Dimensionen mit überprüfen array_diff($array1[0], $array2[0]);.
php -r 'array_diff(array("a" => array("b" => 4)), array(1));'
PHP Notice: Array to string conversion in Command line code on line 1
PHP Stack trace:
PHP 1. {main}() Command line code:0
PHP 2. array_diff() Command line code:1
Eines Ihrer Arrays ist mehrdimensional.
array_diff überprüft nur eine Dimension eines n-dimensionalen Arrays. Natürlich können Sie tiefere Dimensionen mit überprüfen array_diff($array1[0], $array2[0]);
Scheint mir ein Bug zu sein. Die Meldung “Array to String Conversion” ist bestenfalls irreführend.
– Janis Elmeris
9. April 2018 um 11:47 Uhr
ESSEN
Ja, die strenge Antwort lautet, weil “eines Ihrer Arrays mehrdimensional ist”.
Ein weiterer nützlicher Hinweis könnte sein – abhängig von Ihren Bedürfnissen, die tatsächlichen Unterschiede weiter zu analysieren – Erwägen Sie zunächst, Ihre Arrays zu testen mit:
Alle diese Optionen vergleichen den gesamten Array-Baum, nicht nur die oberste Ebene.
$diff = strcmp(json_encode($lagerist), json_encode($arr)); hat nicht funktioniert, gibt immer 0 zurück, wenn es einen Unterschied zwischen den beiden gibt
– Robert Sinclair
12. August 2019 um 15:54 Uhr
kenorb
Seit array_diff nur mit einer Dimension umgehen können, können Sie entweder:
Konvertieren Sie Ihr mehrdimensionales Array in eine Dimension, z. B. durch:
Abflachen eines mehrdimensionalen Arrays, zB:
while ($arr) {
list($key, $value) = each($arr);
is_array($value) ? $arr = $value : $out[$key] = $value;
unset($arr[$key]);
}
// Now $out is flatten version of $arr.
Verwenden Sie benutzerdefinierte rekursive array_diff-ähnliche Funktion,
Das Abflachen eines mehrdimensionalen Arrays ist falsch. Wenn das erste verschachtelte Array angefahren wird, vergisst die Funktion alle anderen Werte im ursprünglichen $arr.
– Kangur
7. November 2017 um 13:48 Uhr
Perfekt! Unserialize funktionierte im Gegensatz zur am meisten positiv bewerteten Antwort. Musste nur $results = array_map(‘unserialize’, $results); Nachwort, um es zu lesen
– Robert Sinclair
12. August 2019 um 15:59 Uhr
Das zweite Beispiel war genau das, wonach ich gesucht habe, danke!!
Zwei Elemente gelten genau dann als gleich, wenn (String) $elem1 === (String) $elem2. Mit anderen Worten: wenn die String-Darstellung gleich ist.
Es sieht also so aus, als ob Sie diese Funktion nicht mit mehrdimensionalen Arrays verwenden können, oder tatsächlich mit jedem Wert, der nicht in eine Zeichenfolge konvertiert werden kann. Dies liegt daran, dass die Funktion Werte in a umwandelt string um den Vergleich zu machen.
Sie können Ihre eigene Funktion schreiben, um Arrays rekursiv auf Unterschiede zu überprüfen. Tatsächlich stammt das Folgende aus den Kommentaren der oben verlinkten Dokumente.
Ich muss nur die Schlüssel vergleichen. Also habe ich array_diff_key() verwendet. Aber es gibt ein Null-Array zurück.
– Benutzer2963765
7. November 2013 um 10:01 Uhr
Wenn es ein leeres Array zurückgibt, bedeutet dies, dass beide Arrays denselben Schlüsselsatz haben.
– max
7. November 2013 um 15:23 Uhr
Ich hatte einen Fehler, bei dem zwei Arrays als unterschiedlich angesehen wurden, aber eindeutig gleich aussahen. Diese Antwort hat mir geholfen, ihre Zeichenfolgendarstellung zu vergleichen, und es war tatsächlich anders.
– Misterone
5. Juli um 19:23 Uhr
Bin heute auf dieses hier gestoßen, als ich an einem Plattform-Upgrade für PHP 7.3 von 5.3 gearbeitet habe … Da ich diesen Wert für eine spätere Verwendung speichere, wollte ich sicher sein, dass ich nicht mit einem “teilweise” serialisierten Array ende kann Dinge stromabwärts kaputt machen.
Danke, Kenorb, dass du mich auf den richtigen Weg gebracht hast (ich habe deine Antwort positiv bewertet). Folgendes funktioniert gut für mich.
Array
(
[foo] => bar
[bar] => Array
(
[test] => test
)
)
Ich muss nur die Schlüssel vergleichen. Also habe ich array_diff_key() verwendet. Aber es gibt ein Null-Array zurück.
– Benutzer2963765
7. November 2013 um 10:01 Uhr
Wenn es ein leeres Array zurückgibt, bedeutet dies, dass beide Arrays denselben Schlüsselsatz haben.
– max
7. November 2013 um 15:23 Uhr
Ich hatte einen Fehler, bei dem zwei Arrays als unterschiedlich angesehen wurden, aber eindeutig gleich aussahen. Diese Antwort hat mir geholfen, ihre Zeichenfolgendarstellung zu vergleichen, und es war tatsächlich anders.
– Misterone
5. Juli um 19:23 Uhr
Der Blaue Attentäter
Das ist meine Lösung für ein ähnliches Problem. Ich möchte zwei assoziative Arrays vergleichen und die geänderten Werte zurückgeben, aber einige der Elemente sind Arrays. Also wenn ich benutze
array_diff_assoc
, es gibt mir “Array-to-String-Fehler”. Meine Funktion vergleicht auch die Elemente, die Arrays sind, und wenn es einen Unterschied gibt, gibt sie das Array-Element zurück. Es ist noch in Arbeit und nicht ausgiebig getestet. Zum Beispiel:
Mögliche Ursache: mehrdimensionale Arrays
– Wjatscheslaw Kondratiuk
7. November 2013 um 8:02 Uhr
“Beide Parameter sind Arrays” Sicher sind sie, und php sagt nichts anderes. Das Problem ist ein Array-zu-String-Konvertierung, nicht umgekehrt. Die Frage ist, was diese Arrays tun enthalten.
– Geomagen
7. November 2013 um 8:03 Uhr
@viakondratiuk Ja, es ist mehrdimensional. Aber wertet array_diff() nicht nur die erste Ebene aus
– Benutzer2963765
7. November 2013 um 8:09 Uhr
@user2963765 Diese Funktion überprüft nur eine Dimension eines n-dimensionalen Arrays. Natürlich können Sie tiefere Dimensionen mit überprüfen
array_diff($array1[0], $array2[0]);
.– Wjatscheslaw Kondratiuk
7. November 2013 um 8:10 Uhr
Sie können eine verwenden
recursive array_diff
. Schau dir das an gist.github.com/jondlm/7709e54f84a3f1e1b67bes hat mein Problem gelöst …– Geneowak
22. Juli 2020 um 18:59 Uhr