【问题标题】:PHP nested foreach not iterating parent varaiblesPHP嵌套foreach不迭代父变量
【发布时间】:2015-04-09 20:06:06
【问题描述】:

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

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

是否有其他方法可以实现这一点,或者我做错了什么/愚蠢?

$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 输出(除了最后的空数组之外似乎正确): Array ( [0] => Array ( [room_id] => 1 [room] => 112 [floor] => 1 [building] => 3 ) [1] => Array ( [room_id] => 2 [room] => 111 [楼层] => 1 [建筑物] => 3) [2] => 数组 ([room_id] => 3 [房间] => 116 [楼层] => 1 [建筑物] => 4) [3 ] => Array ( [room_id] => 4 [room] => 115 [floor] => 1 [building] => 4) [4] => Array ( [room_id] => 5 [room] => 114 [ floor] => 1 [building] => 4) [5] => Array ([room_id] => 6 [room] => 113 [floor] => 1 [building] => 4) [6] => Array ( [room_id] => 7 [房间] => 110 [楼层] => 1 [建筑物] => 5) [7] => 数组 ( [room_id] => 8 [房间] => 109 [楼层] => 1 [建筑] => 5) ) 数组 ( ) 数组 ( ) 数组 ( ) 数组 ( ) 数组 ( ) 数组 ( ) 数组 ( ) 数组 ( ) 数组 ( ) 数组 ( ) 数组 ( ) 数组 ( ) 数组 ( ) 数组 ( ) 数组 ( ) 数组 ( ) 数组 ( ) 数组 ( ) 数组 ( ) 数组 ( )

也许我应该改写这个问题....以上来自我的数据库(尽管数据会大得多),除了 3 栋楼和 6 层楼,我需要一个嵌套列表,例如:

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

【问题讨论】:

  • 我相信 pdo fetchAll 将其输出为 key=>val;在 roomArray 上做一个 var_dump。
  • 你在哪里设置$building$rooms?在第一次迭代中从$rooms 获取所有行后,除非您倒带,否则您不能再次调用$fetchAll。但它每次都会返回相同的东西,那么为什么需要在foreach 循环中这样做呢?
  • 你的问题涉及$buildValue$floorValue,但是代码中没有这样的变量。你的意思是$buildVal$floorVal
  • $roomArray 按预期输出....问题似乎出在 foreach 变量上。是的 $buildVal 和 $floorVal
  • $building 和 $floors 由 foreach1 和 2 中的 $buildingArray 值创建。$rooms 是查询的 pdo 结果。

标签: php foreach


【解决方案1】:

我可以看到索引 $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>';

【讨论】:

  • Inisde if 语句:我正在尝试使用 $buildVal 和 $floorVal 作为循环中位置的引用并检查数据库值 ($room['building'], $ room['floor'] 匹配值并将正确的数据输入到正确的部分。问题是 $buildVal 和 $floorVal 不会在 foreach($roomArray) 中迭代一次。我将在每个 foreach 中添加更多回声提供嵌套列表。
  • 感谢您改进了我草率的前置 :)
  • 你能展示一下 $roomArray 的样子吗?提供 print_r($roomArray) 的输出?
  • 感谢此编辑完美运行,我认为缺少预取导致了问题,现在可以使用 if 语句!我的阴暗代码的优化是一个奖励:)
猜你喜欢
  • 2015-03-09
  • 2015-08-21
  • 2014-07-31
  • 2011-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-07
相关资源
最近更新 更多