2011-07-04 36 views
41

Cómo se puede evitar fácilmente conseguir este error/aviso:¿Cómo evitar Undefined offset

Notice: Undefined offset: 1 in /var/www/page.php on line 149 

... en este código:

list($func, $field) = explode('|', $value); 

No siempre hay dos valores devueltos por explotar, pero si desea usar list(), ¿cómo puede evitar fácilmente el aviso?

Respuesta

93
list($func, $field) = array_pad(explode('|', $value, 2), 2, null); 

dos cambios:

  • Se limita el tamaño de la matriz devuelta por explode() a 2. Parece que hay más que esto es buscado
  • Si hay menos de dos valores devueltos , anexa null hasta que la matriz contenga 2 valores.Ver Manual: array_pad() para más información

Esto significa que, si no hay | en $value, $field === null. Por supuesto, puede usar cada valor que desee para definir como predeterminado para $field (en lugar de null). También es posible cambiar el comportamiento de $func y $field

list($func, $field) = array_pad(explode('|', $value, 2), -2, null); 

Ahora es $funcnull, cuando no hay | en $value.

1

Obtiene un undefined offset cuando lo que está tratando de explotar la cadena por ($value) en realidad no lo tiene, creo.

Esta pregunta es muy similar a esto: undefined offset when using php explode(), donde hay una explicación mucho más amplia que debería resolver completamente su problema.

En cuanto a la comprobación de la aparición de '|' para evitar el error, puede hacer:

$pos = strpos($value,'|'); 

if(!($pos === false)) { 
    //$value does contain at least one | 
} 

Espero que esto ayude.

+0

@Down Voter ¿te importaría explicar por qué? No tengo problemas con la votación negativa si he cometido un error, ¡si pudieras explicar por qué puedo corregir la publicación y también aprender de dónde me he equivocado! Aclamaciones. –

+0

Aún puede obtener un error incluso si 'strpos' devuelve' true'. '$ value = 'casi | perfecto'; $ pos = strpos ($ value, '|'); if ($ pos === true) {list ($ one, $ two, $ three) = explode ('|', $ value); } ' –

0
if (count(explode('|', $value))==2) 
    list($func, $field) = explode('|', $value); 

Sin embargo, es un poco no óptimo.

+1

Explotar dos veces? ¿Por qué no solo detectar si hay un personaje de pipa, luego explotar? –

0

probablemente me romper este en dos pasos

$split = explode('|', $value); 
$func = $split[0]; 
if(count($split) > 1) 
    $field = $split[1]; 
else 
    $field = NULL; 

Probablemente hay una manera más rápida y más limpio sin embargo.

+0

Esto dejaría '$ field' sin definir, que es apenas mejor que un índice indefinido. – phant0m

+0

Sí, tienes razón. He agregado una línea para establecerlo en NULL en caso de que haya sido definido previamente. Pero, en cualquier caso, creo que desearía verificar el valor de $ field antes de usarlo. –

8

No sé de una manera directa de hacer esto que también conserva la conveniencia de

list($func, $field) = explode('|', $value); 

Sin embargo, ya que es realmente una lástima no ser capaz de hacer esto, es posible que desee considerar un enfoque indirecto astuto:

list($func, $field) = explode('|', $value.'|'); 

he añadido a $value tantos | s según sea necesario para asegurarse de que explode producirá al menos 2 elementos de la matriz. Para las variables n, agregue caracteres de delimitador n-1.

De esta forma no obtendrá ningún error, conservará la conveniente asignación list, y los valores que no existan en la entrada se establecerán en la cadena vacía. Para la mayoría de los casos, este último no debería darle ningún problema, por lo que la idea anterior funcionaría.

+0

Si todo se trata de 'no mostrar' el aviso, ¿no podemos simplemente suprimirlo haciendo @explode()? Sé que no es bonito, pero funciona bien, ¿verdad? Si realmente quieres 'evitarlo', entonces tienes toda la razón ... – KilZone

+3

@KilZone: No se trata de "no mostrarlo", sino más bien en la forma de pensar de "este código está escrito de tal manera que si alguna vez da un error, ha adquirido un error ". Además, es mejor evitar el operador '@' si es posible. ¿Conoces [esa advertencia] (http://php.net/manual/en/language.operators.errorcontrol.php) en la documentación del operador? Me he enamorado de eso más de una vez. – Jon

+0

Bien, puedo ver su punto (y el de clarkk), de todos modos me lo estaba preguntando. Ow y sí, sé que esa advertencia, no sería la primera vez que estaba mirando una pantalla en blanco donde debería haber estado mi página. – KilZone

-1

Esto funcionó para mí:

@list($func, $field) = explode('|', $value); 
+0

Errores de supresión, nunca es algo bueno! – bart

+0

Estoy de acuerdo contigo @bart. Eso es cierto en la mayoría de los casos, pero en este caso específico no puedo ver un problema importante que no utilizar eso. – Delmo

0

menudo me encuentro con este tema, así que quería una función que permite algo mejor sintácticamente sin relleno innecesariamente la matriz o cadena.

// Put array entries in variables. Undefined index defaults to null 
function toVars($arr, &...$ret) 
{ 
    $n = count($arr); 
    foreach ($ret as $i => &$r) { 
     $r = $i < $n ? $arr[$i] : null; 
    } 
} 

// Example usage 
toVars(explode('|', $value), $func, $field); 

Para mis propósitos, generalmente estoy trabajando con una matriz, pero se podría escribir una función similar que incluye la función de explotar, así ...

// Explode and put entries in variables. Undefined index defaults to null 
function explodeTo($delimiter, $s, &...$ret) 
{ 
    $arr = explode($delimier, $s); 
    $n = count($arr); 
    foreach ($ret as $i => &$r) { 
     $r = $i < $n ? $arr[$i] : null; 
    } 
} 

// Example usage 
toVars('|', $value, $func, $field); 

Requiere PHP5.6 o arriba para la función variadic: http://php.net/manual/en/functions.arguments.php#functions.variable-arg-list