Массив Неопределенная ошибка индекса (уведомление) в PHP - PullRequest
0 голосов
/ 20 апреля 2010

У меня есть эта функция:

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

проблема в том, что когда я запускаю его, он возвращает эти ошибки(уведомления):

Примечание: неопределенный индекс: 1 в строке 10

Примечание: неопределенный индекс: 1 в строке 10

Примечание: неопределенный индекс: 2 в строке 10

Примечание: неопределенный индекс: 2 в строке 10

Примечание: неопределенный индекс: 2 в строке 10

Примечание: неопределенный индекс: 1 в строке 10

это строка: $coin[$test[$i][$j]][$test[$i][$k]] += 1 / ($some_var - 1);

Проблема в том, что в конце функция возвращает правильную матрицу (массив), и если я проверю, существует ли $coin[$test[$i][$j]][$test[$i][$k]], то она больше не возвращает его.

Любое предложение очень ценится!

Спасибо!

Ответы [ 5 ]

5 голосов
/ 20 апреля 2010
$coin[$test[$i][$j]][$test[$i][$k]] += 1 / ($some_var - 1);

Предупреждение генерируется +=. += необходимо найти элемент перед его добавлением, и вы не инициализировали ни один из элементов в $coin при первом обращении к ним.

3 голосов
/ 20 апреля 2010

Вы можете / должны проверить, чтобы убедиться, что $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;
}
1 голос
/ 20 апреля 2010

Мне кажется, проблема в том, что вы пытаетесь использовать $ 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 голосов
/ 20 апреля 2010

Задумывались ли вы о замене цикла for на цикл foreach?Например:

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);
            }
        }
0 голосов
/ 20 апреля 2010

Я не очень понимаю, но могу предложить вам использовать

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;
}
...