如何避免未定义的偏移
你怎么能轻松避免得到这个错误/通知:
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.看起来,这只是想要的 - 如果返回的值less于两个,则会附加
null
值,直到数组包含2个值。 有关更多信息,请参见手册:array_pad()
这意味着,如果没有|
在$value
, $field === null
。 当然,你可以使用你喜欢的每个值来定义为$field
(而不是null
)的默认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
的许多|
以确保explode
将在arrays中产生至less2个项目。 对于n
variables,添加n-1
分隔符。
这样你就不会得到任何错误,你保持方便的list
分配,并且在input中不存在的任何值将被设置为空string。 对于大多数情况下,后者不应该给你任何问题,所以上述想法将起作用。
当你试图用( $value
)分解string的东西实际上并没有进入时,你会得到一个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;
虽然可能有更快更好的方法。
我经常遇到这个问题,所以我想要一个函数,允许更好的语法没有不必要的填充数组或string。
// 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
这对我工作:
@list($func, $field) = explode('|', $value);