Что лучший способ состоит в том, чтобы выполнить следующее.
У меня есть строки в этом формате:
$s1 = "name1|type1"; //(pipe is the separator)
$s2 = "name2|type2";
$s3 = "name3"; //(in some of them type can be missing)
Давайте примем nameN
/ typeN
строки, и они не могут содержать канал.
Так как я должен извлечь имя / вводят separetly, я делаю:
$temp = explode('|', $s1);
$name = $temp[0];
$type = ( isset($temp[1]) ? $temp[1] : '' );
Есть ли более легкое (более умно безотносительно быстрее) способ сделать это, не имея необходимость делать isset($temp[1])
или count($temp)
.
Спасибо!
Обратите внимание на порядок аргументов для explode()
list($name,$type) = explode( '|',$s1);
$type будет NULL для $s3, хотя это даст Notice
Я поклонник 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);
if(strstr($temp,"|"))
{
$temp = explode($s1, '|');
$name = $temp[0];
$type = $temp[1];
}
else
{
$name = $temp[0];
//no type
}
Может быть?
Нет необходимости делать 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";