php - Come posso correggere questo errore di tipo offset illegale


90

Sto ottenendo

tipo di offset illegale

errore per ogni iterazione di questo codice. Ecco il codice:

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

print_r($s)

10
Avvertenza: quasi tutte le risposte (eccetto quella di zombat) presumono che $sourcesia un'istanza di SimpleXMLe forniscono informazioni che si applicano solo a quella specifica situazione. Anche se alla fine era così, la domanda non lo diceva e chiunque venga qui per riferimento dovrebbe tenerne conto.
Álvaro González

Risposte:


158

Si verificano errori di tipo offset illegali quando si tenta di accedere a un indice di matrice utilizzando un oggetto o una matrice come chiave di indice.

Esempio:

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

Il tuo $xmlarray contiene un oggetto o un array in corrispondenza $xml->entry[$i]->sourcedi un valore di $i, e quando provi a usarlo come chiave di indice per $s, ricevi quell'avvertimento. Dovrai assicurarti che $xmlcontenga ciò che desideri e di accedervi correttamente.


la sorgente contiene html, quella classe è un oggetto?
Steven

Hai creato la $xmlvariabile utilizzando una sorta di parser XML? simple_xml o DOMDocument? In tal caso, è probabile che il nodo di origine sia in realtà una sorta di oggetto elemento dom.
zombat

sto usando simplexml_load_string. questo aiuta?
Steven

Il tuo HTML potrebbe essere stato analizzato come XML e probabilmente tutti i tuoi tag sono diventati nodi. Ad esempio, se avevi uno snippet HTML di "<div> Ciao </div>" come proprietà sorgente, probabilmente hai qualcosa di simile $xml->entry[$i]->source->div. Se vuoi analizzare l'HTML in una struttura DOM, DomDocumentha una loadHTML()funzione che gestisce l'HTML molto meglio di SimpleXML. Scopri php.net/manual/en/domdocument.loadhtml.php
zombat

grazie per quello. Ho usato str_replace per rimuovere l'html e funziona.
Steven

26

Usa trim($source)prima $s[$source].


3
Penso che questa sia la risposta giusta per questa domanda, non quella di zombat
Pmpr

5
Il taglio di un oggetto è solo un modo non ovvio per eseguirne il cast su una stringa (il più semplice sarebbe (string)$source) ei risultati dipendono interamente dalla sua implementazione __toString () . Funziona se hai un SimpleXMLoggetto (qualcosa apparentemente assunto da tutti ma mai realmente dichiarato nella domanda).
Álvaro González

Se questo problema è correlato all'implementazione di __toString (), la chiamata trim () non è una soluzione pulita. È fonte di confusione.
Čamo

3

controlla $ xml-> entry [$ i] esiste ed è un oggetto prima di tentare di ottenerne una proprietà

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

o $ source potrebbe non essere un offset di array legale ma un array, un oggetto, una risorsa o forse un valore nullo


2
L'unica risposta giusta. Devi controllare l'esistenza dell'elemento nell'array. Se non esiste, non puoi accedere alle sue proprietà.
RWC

0

Probabilmente ci sono meno di 20 voci nel tuo xml.

cambia il codice in questo

for ($i=0;$i< sizeof($xml->entry); $i++)
...

4
Un indice intero indefinito non genera un avviso "Scostamento illegale", invece riceverai un E_NOTICE "Indice non definito".
zombat

0

Ho avuto un problema simile. Quando ho ricevuto un carattere da mio figlio XML, ho dovuto convertirlo prima in una stringa (o in un intero, se te ne aspetti uno). Di seguito viene mostrato come ho risolto il problema.

foreach($xml->children() as $newInstr){
        $iInstrument = new Instrument($newInstr['id'],$newInstr->Naam,$newInstr->Key);
        $arrInstruments->offsetSet((String)$iInstrument->getID(), $iInstrument);
    }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.