2010-04-28 38 views
55

Recibo un error de "tipo de compensación ilegal" por cada iteración de este código. Aquí está el código en caso de que alguien pueda ayudar:php - Cómo soluciono este error de tipo de compensación ilegal

$s = array(); 

for($i = 0; $i < 20; $i++){ 

    $source = $xml->entry[$i]->source; 
    $s[$source] += 1; 

} 

print_r($s) 

Cualquier idea. Gracias por adelantado.

+2

Advertencia: casi todas las respuestas (excepto las de zombis) asumen que '$ source' es una instancia de' SimpleXML' y proporciona información que solo se aplica a esa situación específica. Si bien ese fue el caso, la pregunta no lo decía y quien venga aquí como referencia debería tener esto en cuenta. –

Respuesta

97

Illegal offset tipo errores se producen cuando se intenta acceder a un índice de matriz utilizando un objeto o un gama como la clave del índice.

Ejemplo:

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

Su gama $xml contiene un objeto o matriz en $xml->entry[$i]->source para un cierto valor de $i, y cuando intenta usar eso como una clave de índice para $s, se obtiene que la alerta. Deberá asegurarse de que $xml contiene lo que desea y de que está accediendo a él correctamente.

+0

la fuente contiene html, ¿esa clase es un objeto? – Steven

+0

¿Creó la variable '$ xml' usando algún tipo de analizador XML? simple_xml o DOMDocument? En ese caso, entonces es probable que el nodo de origen sea en realidad algún tipo de objeto de elemento dom. – zombat

+0

estoy usando simplexml_load_string. ¿Eso ayuda? – Steven

2

Probablemente haya menos de 20 entradas en su xml.

cambio del código a este

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

gracias, pero no es eso. – Steven

+2

Un índice entero indefinido no genera una advertencia de "compensación ilegal"; en su lugar, obtendría un "índice indefinido" E_NOTICE. – zombat

3

cheque de $ xml-> ingreso [$ i] existe y es un objeto antes de tratar de obtener una propiedad de la misma

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

o $ fuente podría no ser una compensación de matriz legal, sino una matriz, objeto , recurso o posiblemente nulo

+2

La única respuesta correcta.Debes verificar la existencia del elemento en la matriz. Si no existe, no puedes acceder a sus propiedades. – RWC

13

Utilice trim($source) antes de $s[$source].

+2

Creo que esta es la respuesta correcta para esta pregunta, no [la de zombat] (http://stackoverflow.com/questions/2732451/php-how-do-i-fix-this-illegal-offset-type-error # answer-2732502) – Trix

+3

Recortar un objeto es solo una forma no obvia de convertirlo en cadena (el sencillo sería '(cadena) $ fuente') y los resultados dependen completamente de su [__toString()] (http://php.net/manual/en/language.oop5.magic.php#object.tostring) implementación. Funciona si tienes un objeto 'SimpleXML' (algo aparentemente asumido por todos, pero que nunca aparece en la pregunta). –

+0

Si este problema está relacionado con la implementación de __toString(), llamar a trim() no es una solución limpia. Es confuso. –

0

Tuve un problema similar. Como obtuve un personaje de mi hijo XML, tuve que convertirlo primero a un String (o entero, si esperas uno). A continuación se muestra cómo resolví el problema.

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