„Array-zu-String-Konvertierungsfehler“ beim Aufrufen von array_diff_assoc() mit einem mehrdimensionalen Array

Lesezeit: 7 Minuten

Benutzeravatar von user2963765
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

$stockist = array();
while (!feof($file_handle)) {

    $line_of_text = fgetcsv($file_handle);
    $query = "SELECT * FROM reorderchart WHERE medicine=""
        . trim($line_of_text[3])
        . "" ORDER BY medicine";
    $result = mysql_query($query);

    if (trim($line_of_text[2]) - trim($line_of_text[1]) <= 0) {
        
        while ($row = mysql_fetch_array($result)) {

            $file = "results.json";
            $arr = json_decode(file_get_contents($file),true);
            $pharmacy = trim($row['Medicine']);

            if (isset($stockist[$pharmacy])) {
                    
                $medicine = $stockist[$pharmacy];
                $medicine[] = trim($row['Stockist']);
                $stockist[$pharmacy] = $medicine;

            } else {

                $medicine = array();
                $medicine[] = trim($row['Stockist']);
                $stockist[$pharmacy] = $medicine;
            }
        }
    }
}
$diff = array();
$diff = array_diff_assoc($stockist,$arr);
ksort($diff);
foreach ($diff as $key => $value) {

    echo "<table align='center' border="1">";
    echo "<tr><td align = 'center'> <font color="blue"> $key</td></tr>";
    
    foreach($value as $key1 => $value1) {

        echo "<tr><td align ='center'>$value1</td></tr><br>";
    }
    echo "</table>";
}

  • 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


Benutzeravatar von Viacheslav Kondratiuk
Wjatscheslaw Kondratjuk

Demnach:

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

Benutzeravatar von EAT
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:

$diff = strcmp(json_encode($stockist), json_encode($arr));

oder

$diff = strspn(json_encode($stockist) ^ json_encode($arr), "\0");

oder

$diff = xdiff_string_diff(json_encode($stockist), json_encode($arr));

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

Benutzeravatar von kenorb
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.
      
    • Serialisieren des Arrays, zB:

      $results = array_diff(array_map('serialize',$a2), array_map('serialize',$a1)); 
      
  • 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

Sie können im sehen Dokumentation zu array_diff() das:

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.

Du kannst das … sehen kommentiere hier.

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; 
}

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.

Weitere Informationen finden Sie unter http://php.net/manual/en/function.array-diff.php

  • 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.

Code:

$a1 = [
  'foo' => 'bar',
  'bar' => [
    'test' => 'test'
  ],
  'foobar' => 'fizzbuzz'
];

$a2 = [
  'foobar' => 'fizzbuzz',
  'herp' => [
    'derp' => 'herpderp'
  ]
];

$diff = array_diff(array_map('serialize', $a1), array_map('serialize', $a2));

$multidimensional_diff = array_map('unserialize', $diff);

print_r($multidimensional_diff);

Ausgabe:

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


Benutzeravatar von TheBlueAssasin
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:

public static $example1 = [
    'id' => 1,
    'status' => 2,
    'elements' => ['test', 'example'],
    'different' => ['old' => 5, 'new' => 9]
];

public static $example2 = [
    'id' => 1,
    'status' => 3,
    'elements' => ['test', 'example'],
    'different' => ['old' => 5, 'new' => 8]
];

public static function test(){
    die(var_dump(self::udiffAssoc(self::$example1, self::$example2)));
}

public static function udiffAssoc(array $array1, array $array2)
{
    $checkDiff = function ($a, $b) use (&$checkDiff) {
        if (is_array($a) && is_array($b)) {
            return array_udiff_assoc($a, $b, $checkDiff);
        } elseif (is_array($a)) {
            return 1;
        } elseif (is_array($b)) {
            return -1;
        } elseif ($a === $b) {
            return 0;
        } else {
            return $a > $b ? 1 : -1;
        }
    };
    return array_udiff_assoc($array1, $array2, $checkDiff);
}

Wenn Sie ::test ausführen, wird Folgendes zurückgegeben:

array(2) {
    ["status"]=>
    int(2)
    ["different"]=>
    array(2) {
    ["old"]=>
    int(5)
    ["new"]=>
    int(9)
  }
}

1434240cookie-check„Array-zu-String-Konvertierungsfehler“ beim Aufrufen von array_diff_assoc() mit einem mehrdimensionalen Array

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy