Warum gibt array_diff() einen Array-zu-String-Konvertierungsfehler aus?
Lesezeit: 7 Minuten
Benutzer2963765
Ich erhalte einen Array-zu-String-Konvertierungsfehler für die folgende Zeile:
$diff = array_diff($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
Es ist fast 2020 und die Nachricht, die immer noch da ist, führt mich in die Irre
– Kakashi
15. November 2019 um 22:24 Uhr
Es jetzt ist 2020 und ich war gleichermaßen verblüfft über diesen Fehler.
– Jake Bathman
8. Oktober 2020 um 15:13 Uhr
Es ist jetzt 2021 und ich hasse alles.
– Graham S.
14. Januar 2021 um 0:53 Uhr
Es ist jetzt 2022 und ich hasse das alles immer noch
– John
12. Januar um 8:04 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!!
– Steve Baumann
12. September 2019 um 0:57 Uhr
Laut PHP-Dokumentation für die Funktion
Hinweis: Zwei Elemente gelten genau dann als gleich, wenn (String) $elem1 === (String) $elem2. In Worten: wenn die String-Darstellung gleich ist.
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.
function arrayRecursiveDiff($aArray1, $aArray2) {
$aReturn = array();
foreach ($aArray1 as $mKey => $mValue) {
if (array_key_exists($mKey, $aArray2)) {
if (is_array($mValue)) {
$aRecursiveDiff = arrayRecursiveDiff($mValue, $aArray2[$mKey]);
if (count($aRecursiveDiff)) { $aReturn[$mKey] = $aRecursiveDiff; }
} else {
if ($mValue != $aArray2[$mKey]) {
$aReturn[$mKey] = $mValue;
}
}
} else {
$aReturn[$mKey] = $mValue;
}
}
return $aReturn;
}
Es ist erstaunlich, dass Programmierer der PHP-Sprache es für in Ordnung hielten, keine rekursive Version der Funktion zu schreiben. Und um den Array-zu-String-Konvertierungsfehler zu verlassen, anstatt den Fehler so zu sagen wie “unterstützt keine mehrdimensionalen Arrays”.
– ahnbizcad
18. Dezember 2020 um 2: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
)
)
Es ist erstaunlich, dass Programmierer der PHP-Sprache es für in Ordnung hielten, keine rekursive Version der Funktion zu schreiben. Und um den Array-zu-String-Konvertierungsfehler zu verlassen, anstatt den Fehler so zu sagen wie “unterstützt keine mehrdimensionalen Arrays”.
– ahnbizcad
18. Dezember 2020 um 2: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