Offset de string ilegal Aviso PHP


193

Eu recebo um erro estranho do PHP depois de atualizar minha versão do php para 5.4.0-3.

Eu tenho essa matriz:

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

Quando tento acessá-lo assim, recebo avisos estranhos

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


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

Eu realmente não quero apenas editar meu php.ini e redefinir o nível de erro.


20
Obviamente $memcachedConfignão é essa matriz. Showvar_dump($memcachedConfig);
zerkms

1
Isso significa que as chaves não existem. Verifique sua variável var_export($memcachedConfig)antes do "print".
Skrol29

9
O que a maioria das pessoas perdeu é que isso não significa exatamente que o índice não existe - que produz a mensagem "índice indefinido". Este é um erro diferente.
Grantwparks

5
stackoverflow.com/a/20271518/2898712 é a resposta correta aqui.
wedi

19
Atenção quem estiver visualizando esta pergunta: A resposta correta para esta pergunta não é a que está marcada; correto é o de Kzqai abaixo
Aaron

Respostas:


37

Por favor, tente desta forma .... Eu testei este código .... Funciona ....

$memcachedConfig = array("host" => "127.0.0.1","port" => "11211");
print_r($memcachedConfig['host']);

1
Encontrei. Obrigado pela ajuda. var_dump ajudou. Carreguei a matriz de um arquivo de configuração, que tinha o conteúdo strage como este. array (2) {["host"] => string (9) "127.0.0.1" ["port"] => string (5) "11211"} string (5) "m_prefix" PHP 5.4 agora $ xx [' host '] lançou o aviso corretamente.
Thesonix 26/03/12

Eu tive o mesmo erro depois de um include_once($file);. A matriz foi criada corretamente (as informações de depuração mostram isso), no entanto, teve que ser copiada manualmente em outra matriz antes de ser usada sem a mensagem de aviso de PHP ilegal stringoffset.
Franz Holzinger

$ sStartDate = date ("Ymd", strtotime ($ feed ['DTSTART'] ['valor'])); $ sEndDate = data ("Ymd", strtotime ($ feed ['DTEND'] ['valor'])); Como corrigir o mesmo erro aqui Aviso: deslocamento de seqüência ilegal
J. Shabu

302

O erro Illegal string offset 'whatever' in...geralmente significa: você está tentando usar uma string como uma matriz completa.

Isso é realmente possível, pois as strings podem ser tratadas como matrizes de caracteres únicos no php. Então você está pensando que $ var é uma matriz com uma chave, mas é apenas uma sequência com chaves numéricas padrão, por exemplo:

$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

Você pode ver isso em ação aqui: http://ideone.com/fMhmkR

Para quem chega a essa pergunta tentando traduzir a imprecisão do erro em algo a fazer, como eu.


8
Aposto que pode ser demonstrado que esse foi o motivo do problema original. A maioria dos comentários assume incorretamente que "índice indefinido" foi o erro.
Grantwparks

1
Encontrei esse problema em um loop while. Obrigado
David Okwii

Às vezes, este erro pode ocorrer ao tentar agarrar o nó errado de uma matriz multidimensional, ou seja, indo "muito profunda", que precisa pai da selecção vez
zoltar

Isso é correto, eu usei fetchAll(PDO::FETCH_ASSOC)vez fetch(PDO::FETCH_ASSOC)e funcionou perfeitamente.
MNN

Acidentalmente, tenho usado o mesmo $variablename = [];duas vezes, em outra parte do meu código $variablename = "test";que causou a mensagem de erro.
Kai Noack

77

TL; DR

Você está tentando acessar um stringcomo se fosse uma matriz, com uma chave que é um string. stringnão vai entender isso. No código, podemos ver o 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.

Em profundidade

Vamos ver esse erro:

Aviso: deslocamento ilegal de cadeia 'port' in ...

O que isso diz? Diz que estamos tentando usar a string 'port'como um deslocamento para uma string. Como isso:

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

O que causa isso?

Por alguma razão, você esperava um array, mas você tem um string. Apenas uma confusão. Talvez sua variável tenha sido alterada, talvez nunca tenha sido umaarray , não é realmente importante.

O que pode ser feito?

Se sabemos que devemos ter um array, devemos fazer algumas depurações básicas para determinar por que não temos um array. Se não sabemos se teremos um arrayoustring , as coisas ficam um pouco mais complicadas.

O que podemos fazer é todo tipo de verificação para garantir que não tenhamos avisos, avisos ou erros com coisas como is_arraye 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
}

Existem algumas diferenças sutis entre issete array_key_exists. Por exemplo, se o valor de $array['key']for null, issetretornará false. array_key_existsapenas verificará se a chave existe .


13

Há muitas ótimas respostas aqui - mas achei que meu problema era um pouco mais simples.

Eu estava tentando executar o seguinte comando:

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

e estava recebendo esse illegal stringerro $x['name']porque não havia definido a matriz primeiro. Então, eu coloquei a seguinte linha de código antes de tentar atribuir coisas $x[]:

$x = array();

e funcionou.


1
Eu acho que essa deve ser a resposta. Esta deve ser a diferente entre 5.4 (e o anterior a 7) e 7.
sonnb

7

Um pouco atrasado para a pergunta, mas para outros que estão pesquisando: Eu recebi esse erro ao inicializar com um valor errado (tipo):

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

O caminho certo é:

 $varName = array();
 $varName["x"] = "test"; // works

Onde $ varName é iniciada a partir de um valor que deve ser uma matriz, mas pode ser uma cadeia vazia, coagir o valor pode evitar esta situação, por exemplo: $ varName = (matriz) $ shouldBeArray
markdwhite

4

A partir do PHP 5.4, precisamos passar o mesmo valor de tipo de dados que uma função espera. Por exemplo:

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

Ao invocar esta função, se um valor de sequência for fornecido assim:

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

Isso gerará um aviso de deslocamento ilegal devido à incompatibilidade do tipo de dados. Para resolver isso, você pode usar settype:

$id = settype($array['id'],"integer"); // $id now contains an integer instead of a string
testimonial($id); // now running smoothly

Como isso tem a ver com matrizes ...?
some-non-descript-user

2

Antes de verificar a matriz, faça o seguinte:

if(!is_array($memcachedConfig))
     $memcachedConfig = array();

1

No meu caso, altero mysql_fetch_assoc para mysql_fetch_array e resolvo. Demora 3 dias para resolver :-( e as outras versões do meu projeto são executadas com o fetch assoc.


1

No meu caso, eu o resolvi quando mudei na função que faz a consulta sql depois de: return json_encode($array) then:return $array


1

Funciona para mim:

Código de teste meu:

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

Resultado: 55

Verifique pessoal. obrigado


1

Apenas use

$memcachedConfig = array();

antes

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


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

isso ocorre porque você nunca define o que é $ memcachedConfig, portanto, por padrão, é tratado por string e não por matrizes.


1

Resolvi esse problema usando a função trim (). o problema estava no espaço.

então vamos tentar

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

Eu espero que isso te ajude.


0

Apenas caso isso ajude alguém, eu estava recebendo esse erro porque esqueci de desserializar uma matriz serializada. Definitivamente, é algo que eu verificaria se fosse aplicável ao seu caso.


0

É antigo, mas no caso de alguém poder se beneficiar disso. Você também receberá esse erro se sua matriz estiver vazia.

No meu caso, tive:

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

que mudei para:

$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

Eu acho que a única razão para esta mensagem é porque target Array é realmente uma matriz como string etc (JSON -> {"host": "127.0.0.1"}) variável


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

}

Apenas verifique se o valor retornado não está vazio. Portanto, este exemplo foi para PHP, então descubra como verificar se uma matriz está vazia em outras linguagens.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.