65 votes

PHP - Impossible d'utiliser un scalaire comme un tableau.

J'ai le code suivant :

 $final = array();
    foreach ($words as $word) {
        $query = "SELECT Something";
        $result = $this->_db->fetchAll($query, "%".$word."%");
        foreach ($result as $row)
        {
            $id = $row['page_id'];
            if (!empty($final[$id][0]))
            {
                $final[$id][0] = $final[$id][0]+3;
            }
            else
            {
                $final[$id][0] = 3;
                $final[$id]['link'] = "/".$row['permalink'];
                $final[$id]['title'] = $row['title'];
            }
        } 
    }

Le code semble fonctionner correctement, mais je reçois cet avertissement :

Warning: Cannot use a scalar value as an array in line X, Y, Z (the line with: $final[$id][0] = 3, and the next 2).

Quelqu'un peut-il me dire comment réparer cela ?

1 votes

C'est le vrai code ? J'ai essayé de reproduire le problème et je n'ai pas pu...

1 votes

@alvaro-g-vicario Vous avez raison de dire qu'il manque dans le code listé la déclaration qui causerait l'erreur. Quelque chose comme $final[$id] = $row['page_id']; est nécessaire pour que PHP se plaigne

1 votes

C'est le vrai code. c'est un copier coller

106voto

brian_d Points 6783

Vous devez définir $final[$id] à un tableau avant d'y ajouter des éléments. Intiialisez-le avec soit

$final[$id] = array();
$final[$id][0] = 3;
$final[$id]['link'] = "/".$row['permalink'];
$final[$id]['title'] = $row['title'];

ou

$final[$id] = array(0 => 3);
$final[$id]['link'] = "/".$row['permalink'];
$final[$id]['title'] = $row['title'];

1 votes

Vous pouvez simplifier certaines lignes dans le premier cas en $final[$id][] = 3; et dans le second à $final[$id] = array(3); :)

2 votes

@Tadeck oui vous pouvez, je pensais être explicite cependant ; )

8 votes

Cette solution a résolu mon problème, mais le "pourquoi" de cette solution m'échappe. PHP, pour autant que je l'aie utilisé, n'exige pas que vous déclariez le type d'une variable. Mon code fonctionnait bien, et puis la nuit dernière, il a commencé à cracher cette erreur pour une raison inexplicable, tout à fait inattendue. Dans mon code MVC (CodeIgniter), j'assigne systématiquement le type $data = array() au début de mes fonctions. Dans mon code php ordinaire, je le fais rarement. En php, je ne pense pas que ce soit obligatoire. Pourtant, déclarer ma variable comme un type tableau a résolu mon problème. Perplexe.

97voto

Lan Points 413

Un peu tard, mais pour tous ceux qui se demandent pourquoi ils obtiennent le message "Warning : Cannot use a scalar value as an array" ;

La raison est que quelque part vous avez d'abord déclaré votre variable avec un entier normal ou une chaîne de caractères et ensuite vous essayez de la transformer en un tableau.

J'espère que cela vous aidera

0 votes

Mais pourquoi php ne se plaint-il pas lorsqu'il assigne des éléments de tableau à cette variable "plate" en premier lieu ?

0 votes

Je ne suis pas sûr de comprendre marki555 ; si vous le déclarez comme un tableau dès le début, alors tout va bien.

0 votes

Je pense que l'explication est très importante dans ce cas, mais elle ne semble pas être la raison pour laquelle cela a commencé à m'arriver dans un fichier où cela n'arrivait pas avant. Je suis perplexe quant à la raison pour laquelle je l'obtiens dans mon code. Tout d'un coup.

3voto

Peace Ngara Points 139

L'autre problème que j'ai rencontré à ce sujet est l'imbrication de tableaux qui tend à déclencher l'avertissement, considérez ce qui suit :

$data = [
"rs" => null
]

ce qui précède fonctionnera parfaitement si on l'utilise comme ça :

$data["rs"] =  5;

Mais l'application ci-dessous génère un avertissement : :

$data = [
    "rs" => [
       "rs1" => null;
       ]
    ]
..

$data[rs][rs1] = 2; // this will throw the warning unless assigned to an array

2 votes

Je pense que dans ce cas, c'est parce que vous avez oublié de citer la rs y rs1 sur la dernière ligne. Cela en fait des constantes non définies, et donc $data[rs] n'est pas défini.

0voto

Allyn O Points 11

Assurez-vous également que vous ne déclarez pas un tableau et que vous n'essayez pas ensuite d'assigner quelque chose d'autre au tableau, comme une chaîne de caractères, un flottant ou un nombre entier. J'ai eu ce problème. Si vous faites quelques échos de la sortie, je voyais ce que je voulais la première fois, mais pas après un autre passage du même code.

0voto

Benjamin Points 330

Assurez-vous que vous ne l'avez pas déclaré comme un entier, un flottant, une chaîne ou un booléen avant. http://php.net/manual/en/function.is-scalar.php

0 votes

Comment puis-je ajouter un nouvel élément si j'ai besoin d'ajouter une chaîne de caractères ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X