Foreach 嵌套循环

Foreach Nested Loops

这是我的代码。我遇到的问题是,我希望我的 PHP 代码中的 HP 数字进入我的 HP HTML 代码,对于 Cylinders 也是如此。我已经弄清楚了其他的东西,但是当涉及到那部分时,我被卡住了

<?php 

    ini_set('display_errors', 1);
    ini_set('display_startup_errors', 1);
    error_reporting(E_ALL);

    $cars = array(
        array(
            "car"       =>  "Ferrari",
            "model"     =>  "Testarossa",
            "gearbox"   =>  "Manual 5 Shift",
            "designer"  =>  "Battista Pininfarina",
            "engine"    => 
        array(
            "HP"        => 390, 
            "Cylinders" => 12
            ),
        ),

    );

    ?>

    <?php foreach($cars as $cars_key => $car_val): ?>

        <ul>
            <div style="margin-bottom: 10px;">
                <li><b>Car:</b> <?php echo $car_val["car"]; ?></li>
                <li><b>Model:</b> <?php echo $car_val["model"]; ?></li>
                <li><b>Gearbox:</b> <?php echo $car_val["gearbox"]; ?></li>
                <li><b>Designer:</b> <?php echo $car_val["designer"]; ?></li>
                <li><b>Engine</b></li>
                    <ul>
                        <li><b>HP:</b></li>            
                        <li><b>Cylinders:</b></li>                                        
                    </ul>
            </div>
        </ul>
    <?php endforeach; ?>

从你的例子来看,在我看来列表是静态的并且由两个元素组成,那么你根本不需要使用 forEach

<?php foreach($cars as $cars_key => $car_val): ?>
    <ul>
        <div style="margin-bottom: 10px;">
            <li><b>Car:</b> <?php echo $car_val["car"]; ?></li>
            <li><b>Model:</b> <?php echo $car_val["model"]; ?></li>
            <li><b>Gearbox:</b> <?php echo $car_val["gearbox"]; ?></li>
            <li><b>Designer:</b> <?php echo $car_val["designer"]; ?>
            </li>
            <li><b>Engine</b></li>
                <ul>
                    <li><b>HP:</b><?php echo $car_val["engine"]["HP"]; ?></li>            
                    <li><b>Cylinders:</b><?php echo $car_val["engine"]["Cylinders"]; ?></li>                                        
                </ul>
        </div>
    </ul>
<?php endforeach; ?>

如果您确实需要使用嵌套 forEach,请按以下步骤操作:

foreach($cars as $cars_key => $car_val):
  if($cars_key == "engine")
      foreach($car_val["engine"] as $engine_key => $engine_val):
        echo $engine_key.$engine_val;
      endforeach;
endforeach;

我有一些顾虑:

  1. 当您将值硬编码到您的脚本中时,您失去了关联数组的 brilliance/utility,否则您可以从数组中调用。

  2. 我不喜欢 mid-list <div> 的外观。我想不出有什么好的理由用它来打破你的无序列表流程。

  3. 我也不喜欢浮动的sub-list。它在逻辑上属于 Engine 并且良好的标记会指示 sub-list 存在于其父项中。

考虑到我的上述观点,以下是我的建议...

*一些注意事项:

  • 我不确定随着数组大小的增加,您希望如何布置多个列表。
  • 回声只是我个人的喜好。如果愿意,您可以跳进跳出 php。
  • ucfirst() 允许您避免对键进行硬编码。
  • 我的代码片段将使您的任务简洁明了。

代码:(Demo)

$cars = array(
            array(
                "car"       =>  "Ferrari",
                "model"     =>  "Testarossa",
                "gearbox"   =>  "Manual 5 Shift",
                "designer"  =>  "Battista Pininfarina",
                "engine"    =>  array(
                                    "HP"        => 390, 
                                    "Cylinders" => 12
                                )
            )
        );

foreach($cars as $details){
    echo "<ul style=\"margin-bottom:10px;\">";
        foreach($details as $key=>$item){
            echo "<li><b>",ucfirst($key),":</b>";
            if(!is_array($item)){
                echo " $item</li>";
            }else{
                    echo "<ul>";
                        foreach($item as $subkey=>$subval){
                            echo "<li><b>$subkey:</b> $subval</li>";
                        }
                    echo "</ul>";
                echo "</li>";
            }
        }
    echo "</ul>";
}

源代码输出:

<ul style="margin-bottom:10px;">
    <li><b>Car:</b> Ferrari</li>
    <li><b>Model:</b> Testarossa</li>
    <li><b>Gearbox:</b> Manual 5 Shift</li>
    <li><b>Designer:</b> Battista Pininfarina</li>
    <li><b>Engine:</b>
        <ul>
            <li><b>HP:</b> 390</li>
            <li><b>Cylinders:</b> 12</li>
        </ul>
    </li>
</ul>

渲染输出:(运行 我的片段@ phptester.net 看到这个)