PHP взорваться и установить пустую строку недостающие фрагменты - PullRequest
7 голосов
/ 19 мая 2010

Как лучше всего выполнить следующее.

У меня есть строки в этом формате:

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

Предположим, nameN / typeN являются строками, и они не могут содержать трубы.

Так как мне нужно извлечь имя / тип отдельно , я делаю:

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

Есть ли более простой (более умный и быстрый) способ сделать это без необходимости isset($temp[1]) или count($temp).

Спасибо!

Ответы [ 5 ]

8 голосов
/ 19 мая 2010
list($name, $type) = explode('|', s1.'|');
4 голосов
/ 19 мая 2010

Обратите внимание на порядок аргументов для explode ()

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

$ type будет иметь значение NULL для $ s3, хотя он выдаст Уведомление

3 голосов
/ 19 мая 2010

Я фанат array_pop() и array_shift(), которые не выдают ошибку, если используемый массив пустой.

В вашем случае это будет:

$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 голосов
/ 19 мая 2010

Нет необходимости делать isset, так как $ temp [1] будет существовать и содержать пустое значение.Это прекрасно работает для меня:

$str = 'name|type';

// if theres nothing in 'type', then $type will be empty
list($name, $type) = explode('|', $str, 2);
echo "$name, $type";
0 голосов
/ 19 мая 2010
if(strstr($temp,"|"))
{
   $temp = explode($s1, '|');
   $name = $temp[0];
   $type = $temp[1];
}
else
{
   $name = $temp[0];
   //no type
}

Может быть?

...