web-dev-qa-db-fra.com

Pourquoi array_diff () donne une erreur de conversion de tableau à chaîne?

Je reçois une erreur de conversion de tableau en chaîne pour la ligne suivante:

$diff = array_diff($stockist, $arr);

Ici, $arr est un tableau décodé à partir d'un fichier JSON. En utilisant la fonction is_array(), j'ai pu vérifier que les deux paramètres sont des tableaux. Quelqu'un peut me signaler le problème

$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>";
}
45
user2963765

Selon cela:

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

L'un de vos tableaux est multidimensionnel.

array_diff vérifie uniquement une dimension d'un tableau à n dimensions. Bien sûr, vous pouvez vérifier les dimensions plus profondes en utilisant array_diff($array1[0], $array2[0]);

28

Oui, la réponse stricte est parce que "l'un de vos tableaux est multidimensionnel".

Une autre remarque utile pourrait être - selon vos besoins d'analyse ultérieure des différences réelles - envisagez tout d'abord de tester vos tableaux avec:

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

ou

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

ou

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

Toutes ces options compareront l’arborescence entière, pas seulement le niveau supérieur.

15
E.A.T

Puisque array_diff ne peut traiter qu’une seule dimension, vous pouvez soit:

8
kenorb

Selon la documentation de PHP pour la fonction

Remarque: Deux éléments sont considérés comme égaux si et seulement si (chaîne) $ elem1 === (chaîne) $ elem2. En mots: quand la représentation de la chaîne est la même.

Pour plus d'informations, consultez http://php.net/manual/en/function.array-diff.php

6
max

J'ai la même erreur et j'ai trouvé le rapport de bogue suivant pour php:

https://bugs.php.net/bug.php?id=60198

Certaines des fonctions array_ * qui comparent des éléments dans plusieurs tableaux faites-le avec (chaîne) $ elem1 === (chaîne) $ elem2.

Si $ elem1 ou $ elem2 est un tableau, le tableau avec notification de chaîne est jeté.

Array_intersect () .__ est un exemple de fonction pouvant générer ce problème. et array_diff ().

Si ces fonctions ne sont pas censées prendre des tableaux avec d'autres tableaux en tant que valeurs, cela devrait être mentionné sur les pages de documentation.

Ce rapport explique pourquoi php génère une erreur lors de la comparaison d'un tableau multidimensionnel.

1
Trendfischer

Vous pouvez voir dans la documentation array_diff () que:

Deux éléments sont considérés égaux si et seulement si (chaîne) $ elem1 === (chaîne) $ elem2. En d'autres termes: lorsque la représentation sous forme de chaîne est le même.

Il semble donc que vous ne pouvez pas utiliser cette fonction avec un tableau multi-dimensionnel, ou en fait toute valeur ne pouvant pas être convertie en chaîne. En effet, la fonction transforme les valeurs en string pour effectuer la comparaison.

Vous pouvez écrire votre propre fonction pour vérifier récursivement les tableaux pour voir une différence - en fait, ce qui suit est issu des commentaires des documents liés ci-dessus.

Vous pouvez voir le commentaire ici .

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; 
}
0
Jim Wright