如何避免未定义的偏移
你怎么能轻松避免得到这个错误/通知:
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个项目。 对于nvariables,添加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);