PHP: неопределенное смещение в explode ()

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

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

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

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

После explode () у меня есть:

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

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

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

Solutions Collecting From Web of "PHP: неопределенное смещение в explode ()"

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

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

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

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

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

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

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

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

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

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

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

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

Хотя это приемлемо, поскольку 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 } 

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

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

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

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

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

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

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

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

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