Décalage de chaîne illégal Avertissement PHP

194

J'obtiens une erreur PHP étrange après la mise à jour de ma version php vers 5.4.0-3.

J'ai ce tableau:

Array
(
    [host] => 127.0.0.1
    [port] => 11211
)

Quand j'essaye d'y accéder comme ça, j'obtiens d'étranges avertissements

 print $memcachedConfig['host'];
 print $memcachedConfig['port'];


 Warning: Illegal string offset 'host' in ....
 Warning: Illegal string offset 'port' in ...

Je ne veux vraiment pas simplement modifier mon php.ini et redéfinir le niveau d'erreur.

thesonix
la source
20
Ce $memcachedConfign'est évidemment pas ce tableau. Spectaclevar_dump($memcachedConfig);
zerkms
1
Cela signifie que les clés n'existent pas. Vérifiez votre variable avec var_export($memcachedConfig)juste avant le "print".
Skrol29
9
Ce que la plupart des gens ont manqué, c'est que cela ne signifie pas exactement que l'index n'existe pas - cela produit un message "d'index non défini". C'est une erreur différente.
grantwparks
5
stackoverflow.com/a/20271518/2898712 est la bonne réponse ici.
wedi
19
Attention à tous ceux qui consultent cette question: La réponse correcte à cette question n'est pas celle marquée; correct est Kzqai ci
Aaron

Réponses:

37

Veuillez essayer de cette façon ... J'ai testé ce code ... Cela fonctionne ...

$memcachedConfig = array("host" => "127.0.0.1","port" => "11211");
print_r($memcachedConfig['host']);
laisse nurture
la source
1
Je l'ai trouvé. Merci de votre aide. var_dump a aidé. J'ai chargé le tableau à partir d'un fichier de configuration, qui avait le contenu de la strage comme celui-ci. array (2) {["host"] => string (9) "127.0.0.1" ["port"] => string (5) "11211"} string (5) "m_prefix" PHP 5.4 maintenant $ xx [' host '] a lancé l'avertissement correctement.
thesonix
J'ai eu la même erreur après un include_once($file);. Le tableau a été construit correctement (les informations de débogage le montrent), mais il a dû être copié manuellement dans un autre tableau avant d'être utilisable sans le message d'avertissement PHP de décalage de chaîne illégal.
Franz Holzinger le
$ sStartDate = date ("Ymd", strtotime ($ feed ['DTSTART'] ['value'])); $ sEndDate = date ("Ymd", strtotime ($ feed ['DTEND'] ['value'])); Comment corriger la même erreur ici Avertissement: Décalage de chaîne illégal
J. Shabu
304

L'erreur Illegal string offset 'whatever' in...signifie généralement: vous essayez d'utiliser une chaîne comme tableau complet.

C'est en fait possible puisque les chaînes peuvent être traitées comme des tableaux de caractères uniques en php. Vous pensez donc que $ var est un tableau avec une clé, mais c'est juste une chaîne avec des touches numériques standard, par exemple:

$fruit_counts = array('apples'=>2, 'oranges'=>5, 'pears'=>0);
echo $fruit_counts['oranges']; // echoes 5
$fruit_counts = "an unexpected string assignment";
echo $fruit_counts['oranges']; // causes illegal string offset error

Vous pouvez le voir en action ici: http://ideone.com/fMhmkR

Pour ceux qui viennent à cette question en essayant de traduire le flou de l'erreur en quelque chose à faire à ce sujet, comme je l'étais.

Kzqai
la source
8
Je parie que l'on peut montrer que c'était la raison pour laquelle le problème initial s'est produit. La plupart des commentaires supposent à tort que "index non défini" était l'erreur.
grantwparks
1
Ran dans ce problème dans une boucle while. Merci
David Okwii
Parfois, cette erreur peut se produire lorsque vous essayez de saisir le mauvais nœud d'un tableau multidimensionnel, c'est-à-dire que vous allez "trop ​​profondément", vous avez besoin du parent de la sélection à la place
zoltar
C'est correct, je l'ai utilisé à la fetchAll(PDO::FETCH_ASSOC)place fetch(PDO::FETCH_ASSOC)et a parfaitement fonctionné.
MNN
Par accident, j'ai utilisé la même chose $variablename = [];deux fois, dans une autre partie de mon code avec $variablename = "test";laquelle le message d'erreur a été causé.
Kai Noack
77

TL; DR

Vous essayez d'accéder à un stringcomme s'il s'agissait d'un tableau, avec une clé qui est un string. stringne comprendra pas cela. Dans le code, nous pouvons voir le problème:

"hello"["hello"];
// PHP Warning:  Illegal string offset 'hello' in php shell code on line 1

"hello"[0];
// No errors.

array("hello" => "val")["hello"];
// No errors. This is *probably* what you wanted.

En profondeur

Voyons cette erreur:

Avertissement: décalage de chaîne non autorisé 'port' dans ...

Ça dit quoi? Il dit que nous essayons d'utiliser la chaîne 'port'comme décalage pour une chaîne. Comme ça:

$a_string = "string";

// This is ok:
echo $a_string[0]; // s
echo $a_string[1]; // t
echo $a_string[2]; // r
// ...

// !! Not good:
echo $a_string['port'];
// !! Warning: Illegal string offset 'port' in ...

Qu'est-ce qui cause cela?

Pour une raison quelconque, vous vous attendiez à un array, mais vous avez un string. Juste une confusion. Peut-être que votre variable a été modifiée, peut-être qu'elle n'a jamais été un array, ce n'est vraiment pas important.

Ce qui peut être fait?

Si nous savons que nous devrions avoir un array, nous devrions effectuer un débogage de base pour déterminer pourquoi nous n'avons pas de fichier array. Si nous ne savons pas si nous aurons un arrayou string, les choses deviennent un peu plus délicates.

Ce que nous pouvons faire, c'est toutes sortes de vérifications pour nous assurer que nous n'avons pas d'avis, d'avertissements ou d'erreurs avec des choses comme is_arrayet issetou array_key_exists:

$a_string = "string";
$an_array = array('port' => 'the_port');

if (is_array($a_string) && isset($a_string['port'])) {
    // No problem, we'll never get here.
    echo $a_string['port'];
}

if (is_array($an_array) && isset($an_array['port'])) {
    // Ok!
    echo $an_array['port']; // the_port
}

if (is_array($an_array) && isset($an_array['unset_key'])) {
    // No problem again, we won't enter.
    echo $an_array['unset_key'];
}


// Similar, but with array_key_exists
if (is_array($an_array) && array_key_exists('port', $an_array)) {
    // Ok!
    echo $an_array['port']; // the_port
}

Il existe des différences subtiles entre issetet array_key_exists. Par exemple, si la valeur de $array['key']est null, issetrenvoie false. array_key_existsva juste vérifier que, eh bien, la clé existe .

Jon Surrell
la source
13

Il y a beaucoup de bonnes réponses ici - mais j'ai trouvé que mon problème était un peu plus simple.

J'essayais d'exécuter la commande suivante:

$x['name']   = $j['name'];

et j'obtenais cette illegal stringerreur $x['name']parce que je n'avais pas défini le tableau en premier. J'ai donc mis la ligne de code suivante avant d'essayer d'assigner des choses à $x[]:

$x = array();

et cela a fonctionné.

Brian Powell
la source
1
Je pense que cela devrait être la réponse. Cela doit être la différence entre 5.4 (et avant 7) et 7.
sonnb
7

Un peu en retard à la question, mais pour les autres qui recherchent: j'ai eu cette erreur en initialisant avec une mauvaise valeur (type):

$varName = '';
$varName["x"] = "test"; // causes: Illegal string offset

La bonne manière est:

 $varName = array();
 $varName["x"] = "test"; // works
Marco
la source
Où $ varName est initialisé à partir d'une valeur qui devrait être un tableau mais peut être une chaîne vide, la contrainte de la valeur peut éviter cela, par exemple: $ varName = (array) $ shouldBeArray
markdwhite
4

À partir de PHP 5.4, nous devons transmettre la même valeur de type de données qu'une fonction attend. Par exemple:

function testimonial($id); // This function expects $id as an integer

Lors de l'appel de cette fonction, si une valeur de chaîne est fournie comme ceci:

$id = $array['id']; // $id is of string type
testimonial($id); // illegal offset warning

Cela générera un avertissement de décalage illégal en raison d'une incompatibilité de type de données. Pour résoudre ce problème, vous pouvez utiliser settype:

$id = settype($array['id'],"integer"); // $id now contains an integer instead of a string
testimonial($id); // now running smoothly
Anirudh Sood
la source
Comment cela a-t-il à voir avec les tableaux ...?
some-non-descript-user
2

Avant de vérifier la baie, procédez comme suit:

if(!is_array($memcachedConfig))
     $memcachedConfig = array();
dlopezgonzalez
la source
1

Dans mon cas, je change mysql_fetch_assoc en mysql_fetch_array et je résolve. Cela prend 3 jours pour résoudre :-( et les autres versions de mon projet fonctionnent avec fetch assoc.

Pichitron
la source
1

Dans mon cas, je l'ai résolu lorsque j'ai changé de fonction qui fait une requête SQL après: return json_encode($array) puis:return $array

Kleber Caldas
la source
1

Cela fonctionne pour moi:

Code de test de la mienne:

$var2['data'] = array ('a'=>'21','b'=>'32','c'=>'55','d'=>'66','e'=>'77');
foreach($var2 as $result)
{  
    $test = $result['c'];
}
print_r($test);

Production: 55

Vérifiez les gars. Merci

Y. Joy Ch. Singha
la source
1

juste utiliser

$memcachedConfig = array();

avant

 print $memcachedConfig['host'];
 print $memcachedConfig['port'];


 Warning: Illegal string offset 'host' in ....
 Warning: Illegal string offset 'port' in ....

c'est parce que vous ne définissez jamais ce qu'est $ memcachedConfig, donc par défaut sont traités par chaîne et non par tableaux.

chayankQ
la source
1

J'ai résolu ce problème en utilisant la fonction trim (). le problème était celui de l'espace.

alors essayons

$unit_size = []; //please declare the variable type 
$unit_size = exolode("x", $unit_size);
$width  = trim ($unit_size[1] );
$height = trim ($unit_size[2] );

J'espère que cela t'aidera.

Jailendra Rajawat
la source
0

Juste au cas où cela aiderait n'importe qui, j'obtenais cette erreur parce que j'ai oublié de désérialiser un tableau sérialisé. C'est certainement quelque chose que je vérifierais si cela s'applique à votre cas.

Marc
la source
0

C'est un ancien mais au cas où quelqu'un pourrait en bénéficier. Vous obtiendrez également cette erreur si votre tableau est vide.

Dans mon cas, j'avais:

$buyers_array = array();
$buyers_array = tep_get_buyers_info($this_buyer_id); // returns an array
...
echo $buyers_array['firstname'] . ' ' . $buyers_array['lastname']; 

que j'ai changé en:

$buyers_array = array();
$buyers_array = tep_get_buyers_info($this_buyer_id); // returns an array
...
if(is_array($buyers_array)) {
   echo $buyers_array['firstname'] . ' ' . $buyers_array['lastname']; 
} else {
   echo 'Buyers id ' . $this_buyer_id . ' not found';
}
edo.b hiortee
la source
0

Je pense que la seule raison de ce message est parce que le tableau cible est en fait un tableau comme la variable string etc (JSON -> {"host": "127.0.0.1"})

adnan ahmady
la source
0

Pour PHP

//Setup Array like so
$memcachedConfig = array(
  "host" => "127.0.0.1",
  "port" => "11211"
);

//Always a good practice to check if empty

if(isset($memcachedConfig['host']) && isset($memcachedConfig['port'])){

    //Some codes

    print_r ($memcachedConfig['host']);
    print_r ($memcachedConfig['port']);

}

Assurez-vous simplement de vérifier que la valeur renvoyée n'est pas vide. Donc cet exemple était pour PHP alors découvrez comment vérifier si un tableau est vide dans d'autres langues.

Bourse Delorme
la source