Подтвердить что ты не робот

Как избежать смещения undefined

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

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

... в этом коде:

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

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

4b9b3361

Ответ 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);