如何避免未定义的偏移

你怎么能轻松避免得到这个错误/通知:

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); 

现在$funcnull ,当没有|$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);