PHP:为什么每次都返回“未定义的偏移量”?

问题描述

所以基本上这是我为战舰游戏制作的算法。 我的 while 循环有问题,我想让 do while 循环中的代码不断重复,如果生成的值已经存在于多维数组中,并且看起来它确实有效,因为它生成了正确的值,但是我不断收到错误“未定义偏移”,为什么? 是的,我知道这是丑陋的代码,但我真的只是对错误感兴趣,因为否则程序运行良好

enter image description here

 $_SESSION["ladjica1"] = array("","","");
$_SESSION["ladjica2"] = array("","");
$_SESSION["ladjica3"] = array("","");
$_SESSION["ladjica4"] = array("","");
$_SESSION["ladjica5"] = array("","");
$_SESSION["ladjica"] = array(
    $_SESSION["ladjica1"],$_SESSION["ladjica2"],$_SESSION["ladjica3"],$_SESSION["ladjica4"],$_SESSION["ladjica5"]
    
);


function multi_array_iskanje($search_for,$search_in) {
    foreach ($search_in as $element) {
        if ( ($element === $search_for) || (is_array($element) && multi_array_iskanje($search_for,$element)) ){
            return true;
        }
    }
    return false;
}





function generirajLadjo($dolzina,$sirina,$indeksladje) {
do {
$ladjicaROW = rand(1,10)*10-1;
$ladjicaCOL = rand(1,10);
$zacetniPolozaj = $ladjicaROW + $ladjicaCOL;
    
    

for($sir = 0; $sir < $sirina; $sir++) {
$HaliV = rand(0,1);
if($HaliV == 1) {
    if($ladjicaCOL > $dolzina) {
        for($x = 0; $x < $dolzina; $x++) {
            $_SESSION["ladjica".strval($indeksladje)][$x] = $zacetniPolozaj - $x;
        }
    } else {
        for($x = 0; $x < $dolzina; $x++) {
            $_SESSION["ladjica".strval($indeksladje)][$x] = $zacetniPolozaj + $x;
        }
    }
    
} else {
    if(($ladjicaROW > ($dolzina*10)) && $ladjicaROW % 10 != 0) {
        for($x = 0; $x < $dolzina; $x++) {
            $_SESSION["ladjica".strval($indeksladje)][$x] = $zacetniPolozaj - ($x*10);
        }
    } else {
        for($x = 0; $x < 5; $x++) {
            $_SESSION["ladjica".strval($indeksladje)][$x] = $zacetniPolozaj + ($x*10);
        }
        
    }
    
}
}
 } while(multi_array_iskanje($_SESSION["ladjica".strval($indeksladje)][$x],$_SESSION["ladjica"])==true);

  }  
generirajLadjo(5,1,1);
generirajLadjo(4,2);
generirajLadjo(3,3);
generirajLadjo(3,4);
generirajLadjo(2,5);

解决方法

因为 for 循环会增加计数器,然后测试它你的 do-while 限制语句使用了 $x = 5 并且爆炸了

$_SESSION["ladjica".strval($indeksladje)][$x]

超越界限。

我所做的只是 $x--; 作为完成循环和宾果游戏之前的最后一件事。没有错误。

$_SESSION["ladjica1"] = array("","","");
$_SESSION["ladjica2"] = array("","");
$_SESSION["ladjica3"] = array("","");
$_SESSION["ladjica4"] = array("","");
$_SESSION["ladjica5"] = array("","");
$_SESSION["ladjica"] = array(
                        $_SESSION["ladjica1"],$_SESSION["ladjica2"],$_SESSION["ladjica3"],$_SESSION["ladjica4"],$_SESSION["ladjica5"]
                    );


function multi_array_iskanje($search_for,$search_in) 
{
    foreach ($search_in as $element) {
        if ( ($element === $search_for) || (is_array($element) && multi_array_iskanje($search_for,$element)) ){
            return true;
        }
    }
    return false;
}

function generirajLadjo($dolzina,$sirina,$indeksladje) 
{
    do {
        $ladjicaROW = rand(1,10)*10-1;
        $ladjicaCOL = rand(1,10);
        $zacetniPolozaj = $ladjicaROW + $ladjicaCOL;

        for($sir = 0; $sir < $sirina; $sir++) {
            $HaliV = rand(0,1);
            if($HaliV == 1) {
                if($ladjicaCOL > $dolzina) {
                    for($x = 0; $x < $dolzina; $x++) {
                        $_SESSION["ladjica".strval($indeksladje)][$x] = $zacetniPolozaj - $x;
                    }
                } else {
                    for($x = 0; $x < $dolzina; $x++) {
                        $_SESSION["ladjica".strval($indeksladje)][$x] = $zacetniPolozaj + $x;
                    }
                }
            } else {
                if(($ladjicaROW > ($dolzina*10)) && $ladjicaROW % 10 != 0) {
                    for($x = 0; $x < $dolzina; $x++) {
                        $_SESSION["ladjica".strval($indeksladje)][$x] = $zacetniPolozaj - ($x*10);
                    }
                } else {
                    for($x = 0; $x < 5; $x++) {
                        $_SESSION["ladjica".strval($indeksladje)][$x] = $zacetniPolozaj + ($x*10);
                    }
                }
            }
        }
        $x--;
    } while(multi_array_iskanje($_SESSION["ladjica".strval($indeksladje)][$x],$_SESSION["ladjica"])==true);

}  


generirajLadjo(5,1,1);
generirajLadjo(4,2);
generirajLadjo(3,3);
generirajLadjo(3,4);
generirajLadjo(2,5);

控制外循环有点狡猾,结果循环中发生了其他事情 IMO