如何避免未定义的偏移量

时间:2011-07-04 21:47:02

标签: php

如何轻松避免收到此错误/通知:

Notice: Undefined offset: 1 in /var/www/page.php on line 149

...在此代码中:

list($func, $field) = explode('|', $value);

爆炸不会返回两个值,但是如果你想使用list(),那么你怎么能轻易避免通知呢?

8 个答案:

答案 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;
}