php - Como faço para corrigir este erro de tipo de deslocamento ilegal

90

Estou entendendo

tipo de deslocamento ilegal

erro para cada iteração deste código. Aqui está o código:

$s = array();
for($i = 0; $i < 20; $i++){
    $source = $xml->entry[$i]->source;
    $s[$source] += 1;    
}

print_r($s)
Steven
fonte
10
Aviso: quase todas as respostas (exceto zombat) assumem que $sourceé uma instância de SimpleXMLe fornecem informações que se aplicam apenas a essa situação específica. Embora tenha sido esse o caso, a questão não o dizia e quem quer que venha aqui como referência deve levar isso em consideração.
Álvaro González

Respostas:

158

Erros de tipo de deslocamento ilegal ocorrem quando você tenta acessar um índice de matriz usando um objeto ou uma matriz como a chave do índice.

Exemplo:

$x = new stdClass();
$arr = array();
echo $arr[$x];
//illegal offset type

Seu $xmlarray contém um objeto ou array at $xml->entry[$i]->sourcepara algum valor de $i, e quando você tenta usar isso como uma chave de índice para $s, você obtém aquele aviso. Você terá que se certificar de $xmlque contém o que deseja e que está acessando corretamente.

zumbat
fonte
a fonte contém html, isso se classifica como um objeto?
Steven
Você criou a $xmlvariável usando algum tipo de analisador XML? simple_xml ou DOMDocument? Nesse caso, é provável que o nó de origem seja realmente algum tipo de objeto de elemento dom.
zombat
estou usando simplexml_load_string. Isso ajuda?
Steven
Seu HTML pode ter sido analisado como XML e, provavelmente, todas as suas tags se tornaram nós. Por exemplo, se você tinha um trecho de HTML de "<div> Hi </div>" como sua propriedade de origem, provavelmente você tem algo parecido $xml->entry[$i]->source->div. Se você deseja analisar HTML em uma estrutura DOM, DomDocumenttem uma loadHTML()função que lida com HTML muito melhor do que SimpleXML. Confira php.net/manual/en/domdocument.loadhtml.php
zombat
obrigado por isso. Eu usei str_replace para remover o html e funciona.
Steven
26

Use trim($source)antes $s[$source].

Zafer
fonte
3
Acho que esta é a resposta certa para esta pergunta, não a de zumbat
Pmpr
5
Cortar um objeto é apenas uma maneira não óbvia de convertê-lo em string (a mais direta seria (string)$source) e os resultados dependem inteiramente de sua implementação __toString () . Funciona se você tiver um SimpleXMLobjeto (algo aparentemente assumido por todos, mas nunca realmente declarado na pergunta).
Álvaro González
Se este é um problema relacionado com a implementação __toString (), a chamada trim () não é uma solução limpa. Isto é confuso.
Čamo
3

check $ xml-> entry [$ i] existe e é um objeto antes de tentar obter uma propriedade dele

 if(isset($xml->entry[$i]) && is_object($xml->entry[$i])){
   $source = $xml->entry[$i]->source;          
   $s[$source] += 1;
 }

ou $ source pode não ser um deslocamento de array legal, mas um array, objeto, recurso ou possivelmente nulo

brian_d
fonte
2
A única resposta certa. Você tem que verificar a existência do elemento na matriz. Se não existir, você não pode acessar suas propriedades.
RWC
0

Provavelmente, há menos de 20 entradas em seu xml.

mude o código para este

for ($i=0;$i< sizeof($xml->entry); $i++)
...
Byron Whitlock
fonte
4
Um índice inteiro indefinido não gera um aviso de "deslocamento ilegal", você obteria um E_NOTICE de "Índice indefinido".
zombat
0

Eu tive um problema parecido. Como recebi um caractere do meu filho XML, tive que primeiro convertê-lo em uma string (ou inteiro, se você espera um). Veja a seguir como resolvi o problema.

foreach($xml->children() as $newInstr){
        $iInstrument = new Instrument($newInstr['id'],$newInstr->Naam,$newInstr->Key);
        $arrInstruments->offsetSet((String)$iInstrument->getID(), $iInstrument);
    }
user8387356
fonte