PHP Dizi Undefined index hatası (haber)

5 Cevap php

Ben bu işlevi vardır:

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

nerede

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

ve

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

Sorun bunu çalıştırdığınızda, bu hataları (ilan) döndürür olduğunu:

Notice: Undefined index: 1 hattında 10 at

Notice: Undefined index: 1 hattında 10 at

Notice: Undefined index: 2 hat 10 at

Notice: Undefined index: 2 hat 10 at

Notice: Undefined index: 2 hat 10 at

Notice: Undefined index: 1 hattında 10 at

Bu hattı olan: $coin[$test[$i][$j]][$test[$i][$k]] += 1 / ($some_var - 1);

The problem is that at the end the function returns the correct matrix (array) ve if I test to see if $coin[$test[$i][$j]][$test[$i][$k]] exists, then it doesn't return it anymore.

Herhangi bir öneri büyük takdir!

Teşekkürler!

5 Cevap

Sen / $coin[$test[$i][$j]][$test[$i][$k]] değerini artırma önce ayarlanmış olduğundan emin olmak için test edebilir ve etmelidir. Bu kod işlevselliğini değiştirmek gerekir, fakat uyarılar (iyi uygulama olduğu) gitmek yapacaktır.

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;
}
$coin[$test[$i][$j]][$test[$i][$k]] += 1 / ($some_var - 1);

Uyarı += tarafından üretiliyor. += buna eklemeden önce eleman aramak gerekiyor, ve siz onlara erişim $coin ilk kez unsurlardan herhangi başlatılmadı.

Ben sorun iki boyutlu bir dizi olarak $ para kullanmaya çalışıyor olduğunu düşünüyorum.

Eğer iki boyutlu olmasını istiyorsanız, $ para diziler dizisi olmalıdır.

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

Ben pek anlamıyorum ama ben kullanmak önerebilirsiniz

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

Have you thought about swapping out the for loop with a foreach loop? Eg:

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

Bu testin $ [$ i] bir değer olmasının yararı vardır. Ardından, $test[ $i ][ $j ] == null bloğunda, bu koyun:

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