PHP: неопределенное смещение в explode () - PullRequest
9 голосов
/ 14 июля 2011

У меня есть это:

list($firstname, $lastname) = explode(' ', $queryString);

Sometiems $ фамилия не определена, и там я получаю неопределенную ошибку смещения.

Потому что он не может найти ничего, чтобы положить в $ фамилию, я думаю.

После взрыва () у меня есть:

if(!$lastname) { $lastname = $firstname; }

Итак, мой вопрос: как я могу определить его как $ firstname, если $ lastname не определено (если вы написали только «Адам», а не «Адам Томпсон», следует определить фамилию, так что это «Адам Адам»)

Это делает это для меня сейчас, но я получаю ошибку смещения

Ответы [ 5 ]

31 голосов
/ 14 июля 2011
list($firstname, $lastname) = array_pad(explode(' ', $queryString, 2), 2, null);

2 в explode() гарантирует, что существует не более 2 значений, а array_pad() гарантирует, что не менее 2 значений.Если нет пробела , $lastname равно null.Это вы можете использовать, чтобы решить, что будет дальше

$lastname = is_null($lastname) ? $firstname : $lastname;

Небольшое обновление: для этого конкретного случая вы можете использовать небольшую хитрость

list($firstname, $lastname) = array_pad(explode(' ', $queryString, 2), 2, $queryString);

Это сделает все это за один шаг.Это должно работать, потому что

  • Всегда есть хотя бы одно значение (для $firstname)
  • Если есть одно значение, то $queryString == $firstname.То есть теперь значение, которое используется для заполнения массива до 2-х значений (то есть ровно одно, потому что одно значение у нас уже есть)
  • Если есть два значения, то массив не заполняется $queryStringпотому что у нас уже есть 2 значения

По крайней мере, для удобства чтения я бы предпочел первое более очевидное решение.

3 голосов
/ 14 июля 2011

Попробуйте добавить пробел:

list($firstname, $lastname) = explode(' ', $queryString . ' ' );

после этого не нужно ничего менять.

1 голос
/ 19 декабря 2013

Я только что столкнулся с этим сегодня.мое решение не было выше ((которое не имело никакого эффекта), мое было следующим:

while (!feof($fh))
{
    $line = fgets($fh);
    print $line;
}

вместо того, чтобы делать:

while ($line = fgets($fh))
{
     print $line;
}
1 голос
/ 14 июля 2011

Вы получаете не Ошибка , а Уведомление .

Хотя это приемлемо , поскольку PHP является динамическим языком,Вы можете предотвратить это с помощью isset():

if(!isset($lastname)) {
  $lastname = $firstname;
}

ОБНОВЛЕНИЕ

Согласно комментариям, list() является виновником Уведомления ,В этом случае я бы не рекомендовал использовать list(), когда explode() не дает нужного количества параметров.

Если необходимо, ответ по brady или неопределенное смещение при использовании php explode () может работать.Хотя это довольно некрасиво по моему мнению.Я считаю, что ваш код был бы намного более интуитивным, если бы вы просто сделали следующее:

$name = explode(' ', $queryString);

if (isset($name[1])) {
  // show lastname
}
else {
  // show firstname
}
0 голосов
/ 27 июня 2012

Мне не понятно, почему это работает, но уведомление исчезнет. Во-первых, с помощью этого кода я получаю уведомление о неопределенном смещении:

list($month, $day, $year)=explode('-', $dateToChange, 3);

Однако с этим кодом я не делаю:

list($month, $day, $year, $junk)=explode('-', $dateToChange.'---', 4);

Также обратите внимание, что с добавлением '-' или '-' к $ dateToChange я получу уведомление о смещении. В моём примере с четырьмя переменными уходит три черты. $ junk содержит две черты (одна из которых является разделителем).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...