Как избежать неопределенного смещения

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

Notice: Undefined offset: 1 in /var/www/page.php on line 149 

… в этом коде:

 list($func, $field) = explode('|', $value); 

Не всегда есть два значения, возвращаемых в результате взрыва, но если вы хотите использовать list (), как вы можете легко избежать уведомления?

 list($func, $field) = array_pad(explode('|', $value, 2), 2, null); 

Два изменения:

  • Он ограничивает размер массива, возвращаемого explode() на 2. Кажется, что не более того, что требуется
  • Если возвращено менее двух значений, оно добавляет значение null пока массив не будет содержать 2 значения. См. Руководство: array_pad () для получения дополнительной информации

Это означает, что если нет | в $value , $field === null . Конечно, вы можете использовать любое значение, которое вы хотите определить как значение по умолчанию для $field (вместо null ). Также возможно обменять поведение $func и $field

 list($func, $field) = array_pad(explode('|', $value, 2), -2, null); 

Теперь $func имеет значение null , когда нет | в $value .

Я не знаю прямого способа сделать это, что также сохраняет удобство

 list($func, $field) = explode('|', $value); 

Однако, поскольку очень жаль, что вы не можете этого сделать, вы можете рассмотреть скрытый косвенный подход:

 list($func, $field) = explode('|', $value.'|'); 

Я добавил к $value столько | s, если необходимо, чтобы убедиться, что explode произведет как минимум 2 элемента в массиве. Для n переменных добавьте символы n-1 ограничители n-1 .

Таким образом, вы не получите никаких ошибок, вы сохраните удобное назначение list , и любые значения, которые не были на входе, будут установлены в пустую строку. В большинстве случаев последний не должен давать вам никаких проблем, поэтому вышеуказанная идея будет работать.

Я полагаю, вы получаете undefined offset когда вещь, которую вы пытаетесь взорвать строку ( $value ), на самом деле не имеет ее.

Этот вопрос очень похож на этот: undefined offset при использовании php explode () , где есть гораздо больше объяснений, которые должны полностью решить вашу проблему.

Что касается проверки на наличие '|' чтобы предотвратить ошибку, вы можете сделать:

 $pos = strpos($value,'|'); if(!($pos === false)) { //$value does contain at least one | } 

Надеюсь это поможет.

 if (count(explode('|', $value))==2) list($func, $field) = explode('|', $value); 

Однако это немного не оптимально.

Я бы, наверное, сломал это на два шага

 $split = explode('|', $value); $func = $split[0]; if(count($split) > 1) $field = $split[1]; else $field = NULL; 

Однако, вероятно, есть более быстрый и быстрый способ.

Я часто сталкиваюсь с этой проблемой, поэтому мне нужна функция, которая позволила бы что-то более синтаксически без лишнего заполнения массива или строки.

 // Put array entries in variables. Undefined index defaults to null function toVars($arr, &...$ret) { $n = count($arr); foreach ($ret as $i => &$r) { $r = $i < $n ? $arr[$i] : null; } } // Example usage toVars(explode('|', $value), $func, $field); 

Для моих целей я обычно работаю с массивом, но вы можете написать аналогичную функцию, которая включает функцию explode, например …

 // Explode and put entries in variables. Undefined index defaults to null function explodeTo($delimiter, $s, &...$ret) { $arr = explode($delimier, $s); $n = count($arr); foreach ($ret as $i => &$r) { $r = $i < $n ? $arr[$i] : null; } } // Example usage toVars('|', $value, $func, $field); 

Требуется PHP5.6 или выше для вариационной функции: http://php.net/manual/en/functions.arguments.php#functions.variable-arg-list

Это сработало для меня:

 @list($func, $field) = explode('|', $value);