2010-05-19 7 views
7

Quelle est la meilleure façon d'accomplir ce qui suit.PHP explose et met à vide les pièces manquantes

J'ai des chaînes dans ce format:

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

Supposons nameN/typeN sont des chaînes et ils ne peuvent pas contenir un tuyau.

Depuis que je dois exctract le nom/type séparement, je fais:

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

est-il un moyen plus facile de le faire (plus intelligent tout plus rapide) sans avoir à faire isset($temp[1]) ou count($temp).

Merci!

+0

Ne pensez pas, vous obtiendrez une exception/erreur si vous essayez d'accéder '[1]' sans vérifier d'abord. – Aren

+0

Cela ressemble déjà à la solution la plus efficace. – EAMann

Répondre

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

Bon truc pour gérer le potentiel Avis, et une chaîne vide plutôt que d'un zéro –

+0

belle astuce, +1, très intéressant –

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

Peut-être?

+1

Juste un heads-up: Si tout ce que vous voulez faire est de vérifier si une chaîne aiguille est dans une chaine haystack, alors vous devriez utiliser 'strpos()! == false', c'est beaucoup plus rapide que' strstr() ' . – pinkgothic

4

Notez l'ordre des arguments pour exploser()

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

$ type sera NULL pour s3 $, mais il donnera un avis

+0

devra encore vérifier si le type est null et lui assigner '' si c'est le cas si –

+3

si vous faites: @list ($ name, $ type) = explode ('|', $ s1), l'avis sera avalé. @Thomas - tirer parti de la nature non typée de php et permettre à php de jongler avec la valeur nulle en fonction de son utilisation. –

+0

bon point kevin, je suis corrigé –

0

Il n'y a pas besoin de faire isset depuis $ temp [1] existera et contiendra une valeur vide. Cela fonctionne bien pour moi:

$str = 'name|type'; 

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

Je ne comprends pas la limite 2 que vous avez utilisée pour exploser, pour quoi faire? –

+0

@Marco C'est juste au cas où ... – Cristian

+0

vous avez raison, mais en fait, pendant le développement j'utilise 'error_reporting (E_ALL);' et quand '$ str = 'name'', l'appel à' list ($ name, $ type) 'soulève une erreur PHP' Remarque: Offset non défini: 1' –

3

Je suis un fan de array_pop() et array_shift(), qui ne l'erreur pas si le tableau qu'ils utilisent est vide.

Dans votre cas, ce serait:

$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

Point intéressant, mais je pense que l'utilisation de 'list' est plus concis. –

Questions connexes