Desplazamiento de cadena ilegal Advertencia PHP

193

Recibo un extraño error de PHP después de actualizar mi versión de PHP a 5.4.0-3.

Tengo esta matriz:

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

Cuando trato de acceder así, recibo advertencias extrañas

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


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

Realmente no quiero simplemente editar mi php.ini y restablecer el nivel de error.

thesonix
fuente
20
Obviamente $memcachedConfigno es esa matriz. Espectáculovar_dump($memcachedConfig);
zerkms
1
Significa que las claves no existen. Verifique su variable var_export($memcachedConfig)justo antes de la "impresión".
Skrol29
9
Lo que la mayoría de la gente se perdió es que esto no significa exactamente que el índice no exista, eso produce un mensaje de "índice indefinido". Este es un error diferente.
grantwparks
55
stackoverflow.com/a/20271518/2898712 es la respuesta correcta aquí.
Mié
19
Atención, cualquiera que vea esta pregunta: la respuesta correcta a esta pregunta no es la marcada; correcto es Kzqai debajo
Aaron

Respuestas:

37

Por favor, intente de esta manera ... He probado este código ... Funciona ...

$memcachedConfig = array("host" => "127.0.0.1","port" => "11211");
print_r($memcachedConfig['host']);
letnurture
fuente
1
Lo encontré. Gracias por tu ayuda. var_dump ayudó. Cargué la matriz desde un archivo de configuración, que tenía el contenido extraño como este. array (2) {["host"] => string (9) "127.0.0.1" ["port"] => string (5) "11211"} string (5) "m_prefix" PHP 5.4 ahora $ xx [' host '] lanzó la advertencia correctamente.
thesonix
Tuve el mismo error después de un include_once($file);. La matriz se ha compilado correctamente (la información de depuración lo muestra), sin embargo, tuvo que copiarse manualmente en otra matriz antes de poder usarse sin el mensaje de advertencia de desplazamiento de cadena ilegal de PHP.
Franz Holzinger
$ sStartDate = date ("Ymd", strtotime ($ feed ['DTSTART'] ['value'])); $ sEndDate = date ("Ymd", strtotime ($ feed ['DTEND'] ['value'])); Cómo corregir el mismo error aquí Advertencia: Desplazamiento de cadena ilegal
J. Shabu
302

El error Illegal string offset 'whatever' in...generalmente significa: está tratando de usar una cadena como una matriz completa.

Eso es realmente posible ya que las cadenas pueden tratarse como matrices de caracteres individuales en php. Entonces, está pensando que $ var es una matriz con una clave, pero es solo una cadena con claves numéricas estándar, por ejemplo:

$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

Puedes ver esto en acción aquí: http://ideone.com/fMhmkR

Para aquellos que vienen a esta pregunta tratando de traducir la vaguedad del error en algo que hacer al respecto, como yo lo hice.

Kzqai
fuente
8
Apuesto a que se puede demostrar que esta fue la razón por la que ocurrió el problema original. La mayoría de los comentarios asumen incorrectamente que el "índice indefinido" fue el error.
grantwparks
1
Encontré este problema en un bucle while. Gracias
David Okwii
A veces, este error puede ocurrir al intentar tomar el nodo incorrecto de una matriz multidimensional, es decir, ir "demasiado profundo", necesita el padre de la selección en su lugar
zoltar
Esto es correcto, usé en su fetchAll(PDO::FETCH_ASSOC)lugar fetch(PDO::FETCH_ASSOC)y funcionó perfectamente.
MNN
Accidentalmente, he estado usando el mismo $variablename = [];dos veces, en otra parte de mi código con el $variablename = "test";que causó el mensaje de error.
Kai Noack
77

TL; DR

Estás intentando acceder a un stringcomo si fuera una matriz, con una clave que es un string. stringNo lo entenderé. En código podemos ver el problema:

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

A fondo

Veamos ese error:

Advertencia: la cadena ilegal compensa el 'puerto' en ...

¿Qué dice? Dice que estamos tratando de usar la cadena 'port'como un desplazamiento para una cadena. Me gusta esto:

$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é causa esto?

Por alguna razón esperabas un array, pero tienes un string. Solo una confusión. Tal vez su variable fue cambiada, tal vez nunca fue unarray , realmente no es importante.

¿Qué se puede hacer?

Si sabemos que deberíamos tener un array, debemos hacer una depuración básica para determinar por qué no tenemos un array. Si no sabemos si tendremos un arrayo string, las cosas se vuelven un poco más complicadas.

Lo que podemos hacer es todo tipo de comprobación para asegurarse de que no tenemos avisos, advertencias o errores con cosas como is_arrayy isseto 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
}

Hay algunas diferencias sutiles entre issety array_key_exists. Por ejemplo, si el valor de $array['key']es null, issetdevuelve false. array_key_existssolo verificará que, bueno, la clave existe .

Jon Surrell
fuente
13

Aquí hay muchas respuestas excelentes, pero descubrí que mi problema era bastante más simple.

Estaba tratando de ejecutar el siguiente comando:

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

y estaba recibiendo este illegal stringerror $x['name']porque no había definido la matriz primero. Así que puse la siguiente línea de código antes de intentar asignar cosas a $x[]:

$x = array();

Y funcionó.

Brian Powell
fuente
1
Creo que esta debería ser la respuesta. Esto debe ser diferente entre 5.4 (y el anterior a 7) y 7.
sonnb
7

Un poco tarde a la pregunta, pero para otros que están buscando: obtuve este error al inicializar con un valor (tipo) incorrecto:

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

La forma correcta es:

 $varName = array();
 $varName["x"] = "test"; // works
Marco
fuente
Donde $ varName se inicializa a partir de un valor que debería ser una matriz pero puede ser una cadena vacía, coaccionar el valor puede evitar esto, por ejemplo: $ varName = (matriz) $ shouldBeArray
markdwhite
4

A partir de PHP 5.4 necesitamos pasar el mismo valor de tipo de datos que una función espera. Por ejemplo:

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

Al invocar esta función, si se proporciona un valor de cadena como este:

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

Esto generará una advertencia de compensación ilegal debido a la falta de coincidencia del tipo de datos. Para resolver esto, puedes usar settype:

$id = settype($array['id'],"integer"); // $id now contains an integer instead of a string
testimonial($id); // now running smoothly
Anirudh Sood
fuente
¿Cómo tiene esto que ver con las matrices ...?
algún usuario no descripto
2

Antes de verificar la matriz, haga esto:

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

En mi caso, cambio mysql_fetch_assoc a mysql_fetch_array y resuelvo. Se tarda 3 días en resolver :-( y las otras versiones de mi proyecto se ejecutan con fetch assoc.

Pichitron
fuente
1

En mi caso, lo resolví cuando cambié la función que realiza la consulta SQL después de: return json_encode($array) entonces:return $array

Kleber Caldas
fuente
1

A mi me funciona:

Código de prueba mío:

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

Salida: 55

Compruébalo chicos. Gracias

Y. Joy Ch. Singha
fuente
1

Solo usa

$memcachedConfig = array();

antes de

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


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

Esto se debe a que nunca define lo que es $ memcachedConfig, por lo que de forma predeterminada se tratan con cadenas, no con matrices.

chayankQ
fuente
1

Resolví este problema usando la función trim (). El problema era con el espacio.

entonces intentemos

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

Espero que esto ayude.

Jailendra Rajawat
fuente
0

Solo en caso de que ayude a alguien, recibí este error porque olvidé deserializar una matriz serializada. Definitivamente es algo que verificaría si se aplica a su caso.

Bagazo
fuente
0

Es antiguo pero en caso de que alguien pueda beneficiarse de esto. También recibirá este error si su matriz está vacía.

En mi caso tuve:

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

que cambié a:

$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
fuente
0

Creo que la única razón para este mensaje es porque la matriz de destino es en realidad una matriz como cadena, etc. (JSON -> {"host": "127.0.0.1"}) variable

adnan ahmady
fuente
0

Para 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']);

}

Solo asegúrese de verificar que el valor devuelto no esté vacío. Entonces, este ejemplo fue para PHP, así que descubra cómo verificar si una matriz está vacía en otros idiomas.

Delorme Grant
fuente