2010-05-19 15 views
7

¿Cuál es la mejor manera de lograr lo siguiente.PHP explotar y establecer en cadena vacía las piezas faltantes

que tienen cuerdas en este formato:

$s1 = "name1|type1"; //(pipe is the separator) 
$s2 = "name2|type2"; 
$s3 = "name3"; //(in some of them type can be missing) 

Asumamos nameN/typeN son cadenas y no pueden contener una tubería.

Desde que necesito extracto seco de nombre/tipo separetly, que hago:

$temp = explode('|', $s1); 
$name = $temp[0]; 
$type = (isset($temp[1]) ? $temp[1] : ''); 

¿Existe una manera más fácil (lo que sea más inteligente más rápido) para hacer esto sin tener que hacer isset($temp[1]) o count($temp).

Gracias!

+0

no lo creo, que obtendrá una excepción/error si intenta acceder '[1]' sin comprobar primero. – Aren

+0

Esto ya se ve como la solución más efectiva. – EAMann

Respuesta

7
list($name, $type) = explode('|', s1.'|'); 
+0

Buen truco para manejar el potencial Aviso, y una cadena vacía en lugar de un nulo –

+0

buen truco, +1, muy interesante. –

-1
if(strstr($temp,"|")) 
{ 
    $temp = explode($s1, '|'); 
    $name = $temp[0]; 
    $type = $temp[1]; 
} 
else 
{ 
    $name = $temp[0]; 
    //no type 
} 

¿Quién?

+1

Solo una mano a mano: si todo lo que quiere hacer es verificar si una cuerda de aguja está en una cuerda de pajar, entonces debe usar 'strpos()! == falso', es significativamente más rápido que' strstr() ' . – pinkgothic

4

Nota del orden de argumentos para explotar()

list($name,$type) = explode('|',$s1); 

$ tipo será NULL por $ s3, aunque se dará una Aviso

+0

aún tendrá que verificar si el tipo es nulo y asignarle '' '' si es así, –

+3

si lo hace: @list ($ name, $ type) = explode ('|', $ s1), se perderá el aviso. @Thomas: aproveche la naturaleza sin tipo de php y permita que php modifique el valor nulo en función de su uso. –

+0

buen punto kevin, soy corregido –

0

No hay necesidad de hacer isset desde $ temp [1] existirá y contendrá un valor vacío. Esto funciona muy bien para mí:

$str = 'name|type'; 

// if theres nothing in 'type', then $type will be empty 
list($name, $type) = explode('|', $str, 2); 
echo "$name, $type"; 
+0

No entiendo el 2 límite que usaste para explotar, ¿para qué? –

+0

@Marco Es por las dudas ... – Cristian

+0

tienes razón, pero en realidad durante el desarrollo utilizo 'error_reporting (E_ALL);' y cuando '$ str = 'name'', la llamada a' list ($ name, $ type) 'sube un error de PHP' Aviso: Desviación no definida: 1' –

3

Soy un fan de array_pop() y array_shift(), que no error si la matriz que utilizan está vacía.

En su caso, eso sería:

$temp = explode('|', $s1); 
$name = array_shift($temp); 
// array_shift() will return null if the array is empty, 
// so if you really want an empty string, you can string 
// cast this call, as I have done: 
$type = (string) array_shift($temp); 
+0

Punto interesante, pero creo que usar 'list' es más conciso. –

Cuestiones relacionadas