Как избежать смещения undefined
Как вы можете легко избежать получения этой ошибки/уведомления:
Notice: Undefined offset: 1 in /var/www/page.php on line 149
... в этом коде:
list($func, $field) = explode('|', $value);
Не всегда есть два значения, возвращаемых в результате взрыва, но если вы хотите использовать list(), как вы можете легко избежать уведомления?
Ответы
Ответ 1
list($func, $field) = array_pad(explode('|', $value, 2), 2, null);
Два изменения:
- Он ограничивает размер массива, возвращаемого
explode()
, равным 2. Кажется, что не больше, чем это требуется
- Если возвращено менее двух значений, оно добавляет
null
, пока массив не будет содержать 2 значения. Подробнее см. Manual: array_pad().
Это означает, что в $value
, $field === null
нет |
. Конечно, вы можете использовать любое значение, которое вы хотите определить как значение по умолчанию для $field
(вместо null
). Также возможно поменять поведение $func
и $field
list($func, $field) = array_pad(explode('|', $value, 2), -2, null);
Теперь $func
есть null
, когда в $value
нет |
.
Ответ 2
Я не знаю прямого способа сделать это, что также сохраняет удобство
list($func, $field) = explode('|', $value);
Однако, поскольку это очень жаль, что вы не можете этого сделать, вы можете рассмотреть скрытый косвенный подход:
list($func, $field) = explode('|', $value.'|');
Я добавил к $value
как можно больше |
, чтобы убедиться, что explode
будет производить не менее 2 элементов массива. Для переменных n
добавьте символы n-1
разделителя.
Таким образом, вы не получите никаких ошибок, вы сохраните удобное назначение list
, и любые значения, которые не были на входе, будут установлены в пустую строку. В большинстве случаев последний не должен давать вам никаких проблем, поэтому вышеупомянутая идея будет работать.
Ответ 3
Вы получаете undefined offset
, когда вещь, которую вы пытаетесь взорвать строку ($value
), по-моему, не имеет ее.
Этот вопрос очень похож на этот:
undefined смещение при использовании php explode(), где есть более подробное объяснение, которое должно полностью решить вашу проблему.
Что касается проверки на наличие '|' чтобы предотвратить ошибку, вы можете сделать:
$pos = strpos($value,'|');
if(!($pos === false)) {
//$value does contain at least one |
}
Надеюсь, что это поможет.
Ответ 4
if (count(explode('|', $value))==2)
list($func, $field) = explode('|', $value);
Однако это немного не оптимально.
Ответ 5
Я бы, наверное, сломал это на два шага
$split = explode('|', $value);
$func = $split[0];
if(count($split) > 1)
$field = $split[1];
else
$field = NULL;
Вероятно, есть более быстрый и быстрый способ.
Ответ 6
Я часто сталкиваюсь с этой проблемой, поэтому мне нужна функция, которая позволила бы что-то лучше синтаксически без излишнего заполнения массива или строки.
// 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 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
Ответ 7
Это сработало для меня:
@list($func, $field) = explode('|', $value);