如何轻松避免收到此错误/通知:
Notice: Undefined offset: 1 in /var/www/page.php on line 149
...在此代码中:
list($func, $field) = explode('|', $value);
爆炸不会返回两个值,但是如果你想使用list(),那么你怎么能轻易避免通知呢?
答案 0 :(得分:117)
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
。
答案 1 :(得分:10)
我不知道这样做的直接方式也保留了
的便利性list($func, $field) = explode('|', $value);
然而,由于能够做到这一点真的很可惜 ,你可能想要考虑偷偷摸摸的间接方法:
list($func, $field) = explode('|', $value.'|');
我已根据需要将$value
附加到|
,以确保explode
将在数组中生成至少2个项目。对于n
变量,请添加n-1
分隔符字符。
这样您就不会收到任何错误,保留方便的list
赋值,并且输入中不存在的任何值都将设置为空字符串。对于大多数情况,后者不应该给你任何问题,所以上述想法会起作用。
答案 2 :(得分:1)
当你试图通过(undefined offset
)爆炸字符串的东西实际上没有它时,你得到一个$value
,我相信。
这个问题与此非常类似: undefined offset when using php explode(),其中有更多解释可以完全解决您的问题。
至于检查'|'的发生为了防止错误,你可以这样做:
$pos = strpos($value,'|');
if(!($pos === false)) {
//$value does contain at least one |
}
希望这有帮助。
答案 3 :(得分:1)
我可能会把它分成两步
$split = explode('|', $value);
$func = $split[0];
if(count($split) > 1)
$field = $split[1];
else
$field = NULL;
虽然可能会有更快更简洁的方式。
答案 4 :(得分:1)
这对我有用:
@list($func, $field) = explode('|', $value);
答案 5 :(得分:0)
if (count(explode('|', $value))==2)
list($func, $field) = explode('|', $value);
然而,它有点不理想。
答案 6 :(得分:0)
我经常遇到这个问题,所以我想要一个允许语法更好的函数,而不必填充数组或字符串。
// 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 :(得分:0)
想提一提我几十年来使用的通用工具功能。它过滤出空值并修剪空格。它还使用array_pad()
来确保您至少获得了所请求的值数量(如@KingCrunch所建议)。
/**
* Does string splitting with cleanup.
* Added array_pad() to prevent list() complaining about undefined index
* @param $sep string
* @param $str string
* @param null $max
* @return array
*/
function trimExplode($sep, $str, $max = null)
{
if ($max) {
$parts = explode($sep, $str, $max); // checked by isset so NULL makes it 0
} else {
$parts = explode($sep, $str);
}
$parts = array_map('trim', $parts);
$parts = array_filter($parts);
$parts = array_values($parts);
$parts = array_pad($parts, $max, null);
return $parts;
}