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 = newstdClass();
$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.
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.
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
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);
}
$source
é uma instância deSimpleXML
e 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.Respostas:
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
$xml
array contém um objeto ou array at$xml->entry[$i]->source
para 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$xml
que contém o que deseja e que está acessando corretamente.fonte
$xml
variá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.$xml->entry[$i]->source->div
. Se você deseja analisar HTML em uma estrutura DOM,DomDocument
tem umaloadHTML()
função que lida com HTML muito melhor do que SimpleXML. Confira php.net/manual/en/domdocument.loadhtml.phpUse
trim($source)
antes$s[$source]
.fonte
(string)$source
) e os resultados dependem inteiramente de sua implementação __toString () . Funciona se você tiver umSimpleXML
objeto (algo aparentemente assumido por todos, mas nunca realmente declarado na pergunta).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
fonte
Provavelmente, há menos de 20 entradas em seu xml.
mude o código para este
for ($i=0;$i< sizeof($xml->entry); $i++) ...
fonte
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); }
fonte