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

Je reçois une étrange erreur PHP après la mise à jour de ma version php à 5.4.0-3.

J'ai ce tableau:

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

Quand j'essaie d'y accéder comme ceci, j'obtiens des avertissements étranges

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


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

Je ne veux vraiment pas juste éditer mon php.ini et re-définir le niveau d'erreur.

148
demandé sur Bharata 2012-03-26 12:55:03

12 réponses

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

$memcachedConfig = array("host" => "127.0.0.1","port" => "11211");
print_r ($memcachedConfig['host']);
31
répondu letsnurture 2012-06-28 11:41:12

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

C'est en fait possible puisque les chaînes peuvent être traitées comme des tableaux de caractères simples en php. Donc, vous pensez que $var est un tableau avec une clé, mais c'est juste une chaîne avec des clés 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 dans quelque chose à faire à ce sujet, comme je l'ai été.

220
répondu Kzqai 2014-08-20 16:55:15

TL; DR

Vous essayez d'accéder à un string, comme si c'était un tableau, avec une clé qui est un string. {[3] } ne 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 illégal 'port' dans ...

Que faut-il dire? Il dit que nous essayons d'utiliser la chaîne 'port' comme décalage pour une chaîne. Comme ceci:

$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 certains raison pour laquelle vous attendiez un array, mais vous avez un string. Juste un mix-up. 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.

Que peut-on faire?

Si nous savoir, nous devrions avoir un array, on devrait faire de la base de débogage afin de déterminer pourquoi nous n'avons pas de array. Si nous ne savons pas si nous aurons un array ou string, les choses deviennent un peu plus compliqué.

Ce que nous pouvons faire, c'est toutes sortes de vérifications pour nous assurer que nous n'avons pas des avis, des avertissements ou des erreurs avec des choses comme is_array et isset ou 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 quelques petites différences entre les isset et array_key_exists. Par exemple, si la valeur de $array['key'] est null, isset retourne false. array_key_exists va juste vérifier que, eh bien, la clé existe.

59
répondu Jon Surrell 2016-01-15 09:03:54

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

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

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

Et je recevais cette erreur illegal string sur $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 ça a marché.

9
répondu Brian Powell 2016-03-10 21:08:48

À partir de PHP 5.4, nous devons passer 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 de l'incompatibilité de type de données. Afin de 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
4
répondu Anirudh Sood 2016-08-11 16:51:33

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 façon est:

 $varName = array();
 $varName["x"] = "test"; // works
3
répondu Marco 2018-01-03 15:08:07

Avant de vérifier le tableau, faites ceci:

if(!is_array($memcachedConfig))
     $memcachedConfig = array();
1
répondu dlopezgonzalez 2014-12-04 11:14:47

Dans mon cas, je change mysql_fetch_assoc en mysql_fetch_array et résous. Il faut 3 jours pour résoudre : - (et les autres versions de mon proyect fonctionnent avec fetch assoc.

1
répondu Pichitron 2015-06-05 18:56:52

Juste au cas où cela aiderait n'importe qui, je recevais 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.

0
répondu Marc 2017-03-07 09:52:51

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';
}
0
répondu edo.b hiortee 2017-05-09 17:58:20

Dans mon cas, je l'ai résolu quand j'ai changé de fonction qui n' sql requête après: return json_encode($array) alors: return $array

0
répondu Kleber Caldas 2017-06-09 07:21:58

Cela fonctionne pour moi:

Code de test de la mine:

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

Sortie: 55

Vérifiez les gars. Merci

0
répondu Y. Joy 2018-10-01 19:44:15