PHP 中的数组未定义索引错误(注意)

Array Undefined index error (notice) in PHP

提问人:Alex 提问时间:4/20/2010 最后编辑:Alex 更新时间:7/6/2013 访问量:10638

问:

我有这个功能:

function coin_matrix($test, $revs) {
    $coin = array();

    for ($i = 0; $i < count($test); $i++) {
        foreach ($revs as $j => $rev) {
            foreach ($revs as $k => $rev) {
            if ($j != $k && 
                $test[$i][$j] != null && 
                $test[$i][$k] != null) {

                $coin[$test[$i][$j]][$test[$i][$k]] += 1 / ($some_var - 1);
                }
            }
        }
    }
    return $coin;
}

哪里

$test = array(
array('3'=>'1','5'=>'1'),
array('3'=>'2','5'=>'2'),
array('3'=>'1','5'=>'2'),
array('3'=>'1','5'=>'1'));

$revs = array('3'=>'A','5'=>'B');

问题是当我运行它时,它会返回以下错误(通知):

注意:未定义索引:第 10 行为 1

注意:未定义索引:第 10 行为 1

注意:未定义索引:第 10 行为 2

注意:未定义索引:第 10 行为 2

注意:未定义索引:第 10 行为 2

注意:未定义索引:第 10 行为 1

这是一行:$coin[$test[$i][$j]][$test[$i][$k]] += 1 / ($some_var - 1);

问题是,最后函数返回正确的矩阵(数组),如果我测试是否存在,那么它不再返回它。$coin[$test[$i][$j]][$test[$i][$k]]

任何建议将不胜感激!

谢谢!

php 数组 undefined-index

评论


答:

0赞 Ali Demirci 4/20/2010 #1

我不太明白,但我可以建议你使用

function coin_matrix($test, $revs) {
    $coin = array();

    for ($i = 0; $i < count($test); $i++) {
        foreach ($revs as $j => $rev) {
            foreach ($revs as $k => $rev) {
            if (($j != $k) && 
                ($test[$i][$j] != null) && 
                ($test[$i][$k] != null)) {

                $coin[$test[$i][$j]][$test[$i][$k]] += 1 / ($some_var - 1);
                }
            }
        }
    }
    return $coin;
}
3赞 Scott Saunders 4/20/2010 #2

您可以/应该进行测试以确保在递增值之前设置了该值。这不应该改变代码的功能,但会使通知消失(这是很好的做法)。$coin[$test[$i][$j]][$test[$i][$k]]

function coin_matrix($test, $revs) {
    $coin = array();

    for ($i = 0; $i < count($test); $i++) {
        foreach ($revs as $j => $rev) {
            foreach ($revs as $k => $rev) {
            if ($j != $k && 
                $test[$i][$j] != null && 
                $test[$i][$k] != null) {

                    // new tests go here
                    if(!isset(coin[$test[$i][$j]])) 
                    {
                        coin[$test[$i][$j]] = array(); 
                    }
                    if(!isset(coin[$test[$i][$j]][$test[$i][$k]])) 
                    {
                        coin[$test[$i][$j]][$test[$i][$k]] = 0; 
                    }

                    $coin[$test[$i][$j]][$test[$i][$k]] += 1 / ($some_var - 1);
                }
            }
        }
    }
    return $coin;
}

评论

0赞 Alex 4/20/2010
如果我这样做,那么该功能将不再起作用。我应该提到,最后它返回正确的矩阵(数组)
0赞 Scott Saunders 4/20/2010
它是如何破裂的?是否确定仅在未设置变量时才设置变量?
1赞 Scott Saunders 4/21/2010
我扩展了代码,以便您可以查看上下文。很乐意帮忙。
5赞 Powerlord 4/20/2010 #3
$coin[$test[$i][$j]][$test[$i][$k]] += 1 / ($some_var - 1);

警告是由 生成的。 在添加元素之前需要查找元素,并且您在第一次访问它们时尚未初始化任何元素。+=+=$coin

1赞 coolnalu 4/20/2010 #4

我认为问题是您正在尝试将$coin用作二维数组。

如果你想让它是二维的,$coin必须是一个数组的数组。

function coin_matrix($test, $revs) {

    $coin = array();

    for ($i = 0; $i < count($test); $i++) {
        foreach ($revs as $j => $rev) {
            foreach ($revs as $k => $rev) {
            if ($j != $k && 
                $test[$i][$j] != null && 
                $test[$i][$k] != null) {
                // add this.
                if ($coin[$test[$i][$j]] == null){
                    $coin[$test[$i][$j]] = array();
                }
                // end
                $coin[$test[$i][$j]][$test[$i][$k]] += 1 / ($some_var - 1);
                }
            }
        }
    }
    return $coin;
}
0赞 cwallenpoole 4/21/2010 #5

你有没有想过用foreach循环换掉for循环? 例如:

foreach( $tests as $i => $test )

这样做的好处是$test[ $i ]。然后,在您的块中,放置以下内容:$test[ $i ][ $j ] == null

        if ($j != $k && 
            // I suspect that this will cause errors too.
            // Do yourself a favor and add this sanity check.
            isset( $test[$j] ) && $test[$j] != null && 
            isset( $test[$k] ) && $test[$k] != null) {

                $currentK = $test[$k];
                $currentJ = $test[$j];
                // Use debug lines if setting things directly won't work
                if( !isset( $coin[ $currentJ ] ) || !is_array( $coin[ $currentJ ] ) )
                {
                    // $coin[ $currentJ ] = array();
                    die( "<pre>$currentK $currentJ \n" .  print_r( $coin ) );
                }
                $currentCoin =& $coin[ $currentJ ];
                if( !isset( $currentCoin [ $currentK ] ) || 
                    !is_array( $currentCoin [ $currentK ] ) )
                {
                    // Just curious, but when doing these checks before,
                    // did you remember to assign a numeric value here?
                    // 
                    // $currentCoin[ $currentK ] = 0;
                    die( "<pre>$currentK $currentJ \n" .  print_r( $coin ) );
                }
                $currentCoin[ $currentK ] += 1 / ($some_var - 1);
            }
        }