PHP 嵌套的 foreach 不迭代父变量

PHP nested foreach not iterating parent varaibles

PHP 的新手并尝试创建一个嵌套列表,可能做得很草率,但记住了特定的结构。我正在尝试检查列表结构是否与数据库值匹配。

问题:似乎无法在第 3 个 foreach 循环(引用数据库的循环)中迭代 'buildValue' 和 'floorValue' 变量(在 foreach1 和 2 中创建)。还尝试了 while 循环,结果相同。

是否有其他方法可以实现此目的,或者我正在做某事 wrong/stupid?

$htmlArray = array();
$buildingArray = array();

$buildingArray["0"] = array("4","3","2","1","0","01","02");
$buildingArray["1"] = array("4","3","2","1","0","01","02");
$buildingArray["2"] = array("4","3","2","1","0","01","02");

    foreach ($buildingArray as $bkey => $building) 
    {
        switch ($bkey) 
        {
            case "0":
                $htmlArray[0]['building'] = "Biology";
            break;
            case "1":
                $htmlArray[1]['building'] = "Chemistry";
            break;
            case "2":
                $htmlArray[2]['building'] = "Environmental";
            break;
        }

        $buildVal = $bkey;

        foreach ($building as $fkey => $floor) 
        {
            $floorVal = $floor;

            $prepend ='Floor ';
            $title = $prepend.$floor;
            $htmlArray[$fkey]['floor'] = $title;

            // Iterate over the items results 

           //NO PROBLEM: These values (reference foreach1 & foreach2) output correct result!
            echo("build=".$buildVal." ");
            echo("floor=".$floorVal." ");

            $roomArray= array();
            $roomArray = $rooms -> fetchAll(PDO::FETCH_ASSOC);

            foreach ($roomArray as $row) 
            {
                //PROBLEM: These values (reference foreach1 & foreach2) do not iterate inside foreach 3, only output 1st building and floor!

                echo("build=".$buildVal." ");
                echo("floor=".$floorVal." ");

                //echo any results matching building and floor
                if($row["building"] == $buildVal+3 && $row["floor"] == $floorVal)
                {
                    // echo($row["room");

                }

            }

        }


    }

没有问题输出: 建造=0 层=4 建造=0 层=3 建造=0 层=2 建造=0 层=1 建造=0 层=0 建造=0 层=01 建造=0 层=02 建造=1 层=4 建造= 1楼=3楼=1楼=2楼=1楼=1楼=1楼=0楼=1楼=01楼=1楼=02楼=2楼=4楼=2楼=3楼=2楼=2 楼=2 楼=1 楼=2 楼=0 楼=2 楼=01 楼=2 楼=02

问题输出: 建造=0 层=4 建造=0 层=4 建造=0 层=4 建造=0 层=4 建造=0 层=4 建造=0 层=4 建造=0 层=4 建造=0 层=4

$RoomArray 输出(似乎是正确的,除了末尾的空数组): 数组([0] => 数组([room_id] => 1 [房间] => 112 [楼层] => 1 [建筑物] => 3)[1] => 数组([room_id] => 2 [room] => 111 [floor] => 1 [building] => 3 ) [2] => Array ( [room_id] => 3 [room] => 116 [floor] => 1 [building] => 4 ) [3] => Array ( [room_id] => 4 [room] => 115 [floor] => 1 [building] => 4 ) [4] = > 数组 ( [room_id] => 5 [房间] => 114 [楼层] => 1 [建筑物] => 4 ) [5] => 数组 ( [room_id] => 6 [ room] => 113 [floor] => 1 [building] => 4 ) [6] => Array ( [room_id] => 7 [room] => 110 [floor] => 1 [building] => 5 ) [7] => Array ( [room_id] => 8 [room] => 109 [floor] => 1 [building] => 5 ) ) Array ( ) Array ( ) Array ( )数组 () 数组 () 数组 () 数组 () 数组 () 数组 () 数组 () 数组 () 数组 () 数组 () 数组 () 数组 () 数组 () 数组 () 数组 () 数组 () 数组 ( )

也许我应该重新表述这个问题....以上来自我的数据库(尽管数据会大得多),除了 3 栋建筑和 6 层楼,我需要一个像这样的嵌套列表:

 -Building1
   -Floor1
     -Room121
 -Building2
   -Floor1
   -Floor2
     -Room221

等等

我发现索引 $htmlArray 变量有一些问题,但我不确定 $roomArray 出现后你在做什么。 看看下面的代码,也许它有帮助。如果不是 - 请准确说明 $roomArray 循环有什么问题,$roomArray 是什么。

编辑 我更新了我的答案,检查这是否给你需要的输出。

    $buildingArray["0"] = array("4","3","2","1","0","01","02");
    $buildingArray["1"] = array("4","3","2","1","0","01","02");
    $buildingArray["2"] = array("4","3","2","1","0","01","02");
    # Added simple dictionary
    $btype = array("Biology","Chemistry","Environmental");
    # Prefetch all rooms.
    $roomArray= array();
    $roomArray = $rooms -> fetchAll(PDO::FETCH_ASSOC);
    #
    foreach ($buildingArray as $bkey => $building) 
    {
        # This is much nicer than case...
        $htmlArray[$bkey]['building'] = $btype[$bkey];

        foreach ($building as $fkey => $floor) 
        {
            # Two things here - first, user sprintf instead of '.'.
            # Second - You got keys owerwritten with using $fkey as the first key.
            $htmlArray[$bkey]['floor'][$fkey]['title'] = sprintf('Floor %s',$floor);
            foreach ($roomArray as $room) 
            {
                if($room['building']==($bkey+3) and $room['floor']==$fkey)
                {
                    $htmlArray[$bkey]['floor'][$fkey]['rooms'][$room['room_id']] = $room['room'];
                }
            }
        }
    }
    echo '<pre>';
    print_r($htmlArray);
    echo '</pre>';