如何轻松避免出现此错误/提示:
Notice: Undefined offset: 1 in /var/www/page.php on line 149
...在这段代码中:
list($func, $field) = explode('|', $value);
explode并不总是返回两个值,但如果你想使用list()函数,如何避免出现notice提示?
如何轻松避免出现此错误/提示:
Notice: Undefined offset: 1 in /var/www/page.php on line 149
...在这段代码中:
list($func, $field) = explode('|', $value);
explode并不总是返回两个值,但如果你想使用list()函数,如何避免出现notice提示?
list($func, $field) = array_pad(explode('|', $value, 2), 2, null);
有两个改动:
explode()
返回的数组大小为2来实现。似乎不需要更多null
直到数组包含2个值。有关更多信息,请参见手册:array_pad()这意味着,如果 $value
中没有 |
,则 $field === null
。当然,您可以使用任何您喜欢定义为 $field
默认值(而不是 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
在数组中至少生成2个项目。 对于n
变量,添加n-1
个分隔符。
这样做可以避免出现错误,同时保持方便的list
赋值,任何输入中不存在的值都将设置为空字符串。对于大多数情况而言,后者不应该会给您带来任何问题,因此上述方法应该可行。
这个方法适用于我:
@list($func, $field) = explode('|', $value);
$value
) 时,如果该字符串中没有所需内容,则会出现 undefined offset
错误。$pos = strpos($value,'|');
if(!($pos === false)) {
//$value does contain at least one |
}
strpos
返回 true
,仍然可能会出现错误。$value = 'almost|perfect'; $pos = strpos($value,'|'); if ($pos === true) { list($one, $two, $three) = explode('|', $value); }
- David Kmenta我可能会将此分为两个步骤。
$split = explode('|', $value);
$func = $split[0];
if(count($split) > 1)
$field = $split[1];
else
$field = NULL;
$field
未定义,这几乎比未定义索引更糟糕。 - phant0mif (count(explode('|', $value))==2)
list($func, $field) = explode('|', $value);
然而,它略微不太优化。
我想提到一个我使用了几十年的更通用的实用函数。它过滤掉空值并修剪空格。它还使用 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;
}
// 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函数,如下所示...
// 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
@
操作符。你知道在文档中对该操作符的警告吗?我曾多次因此犯错。 - Jon