Как вы можете легко избежать получения этой ошибки / уведомления:
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);