在PHP中循环遍历不同长度的数组

时间:2015-05-12 07:26:41

标签: php arrays

我的订单有这样的输入:

<input type="text" name="booking[Sandwich][Roastbeef][qty]"  />
<input type="text" name="booking[Sandwich][Cheese][qty]"  />
<input type="text" name="booking[Pizza][Classic][qty]"  />
<input type="text" name="booking[Pizza][Special][qty]"  />
<input type="text" name="booking[Coffee][qty]"  />

我无法正确循环播放数组。

以下是我想要的输出:

<h2>Sandwich</h2>
<p><strong>Roastbeef:</strong> 10</p>
<p><strong>Cheese:</strong> 5</p>

<hr>
<h2>Coffee</h2>
<p><strong>Quantity:</strong> 15</p>

如果所有披萨输入都是空的,则不应打印标题“Pizza”!与“咖啡”或“三明治”组相同。如果订单中不包含任何内容,则不应打印标题。

我不能为每个输入编写特定的测试,因为我有200个。

以下是我试图做的事情:

$booking = $_POST['booking'];   

//First check if there is one or more input that is not empty
if (!empty($booking)) {

  foreach ($booking as $type => $items) {
    if (count(array_filter($items))) {
        $order .= "<hr>\n<h2>" . ucfirst($type) . ":</h2>\n";
    }
    foreach ($items as $name => $qty) {
        if ($qty > "0"){
            $order .= "<p><strong>" . ucfirst($name) . ":</strong> "  . $qty . "</p>\n";
        }
    }
  }
}

此代码仅在数组长度为两个键时有效。我似乎无法将我的大脑包裹起来,如何处理其他长度。任何帮助都会很棒!

编辑:

根据@treegarden的回答,我几乎得到了我所需要的东西。现在我只需要检查“组”是否为空,然后不应打印<h2>。如果组是空的,if (count(array_filter($entry)))可以不打印任何东西,但仅适用于那些只有两个键的输入。

if (!empty($booking)) {

    foreach($booking as $key=>$entry) {
        if (count(array_filter($entry))) {

            echo "<h2>$key</h2>"; //Should only be printed if one or more inputs in the group are not empty

            foreach($entry as $key=>$subEntry) {
                if(is_array($subEntry) && $subEntry['qty'] > 0) {
                    echo "<p><strong>$key:</strong>" . $subEntry['qty'] . "</p>";
                } elseif(!is_array($subEntry) && $subEntry > 0) {
                    echo "<p><strong>Quantity:</strong>  $subEntry</p>";
                }
            }
            echo '<hr/>';
        }
    }        


}  

2 个答案:

答案 0 :(得分:0)

也许从示例摘录中尝试recursion

<?php
class RecursiveArrayOnlyIterator extends RecursiveArrayIterator {
  public function hasChildren() {
    return is_array($this->current());
  }
}
?>

否则一个简单的前进方式是假设你有三个或更多嵌套循环, 使用is_array()继续检查$ kv $ $,这是通过调用函数来完成的。

答案 1 :(得分:0)

试试这个

$booking = $_POST['booking'];

if (!empty($booking)) {

  foreach ($booking as $type => $items) {
    if (count(array_filter($items))) {
        $order .= "<hr>\n<h2>" . ucfirst($type) . ":</h2>\n";
    }
    foreach ($items as $name => $qty) {
        if (is_array($qty)) {
           foreach ($qty as $qt) {
           if ($qty > "0"){
            $order .= "<p><strong>" . ucfirst($name) . ":</strong> "  . $qt. "</p>\n";
            }
        }
        } else {
        if ($qty > "0"){
            $order .= "<p><strong>" . ucfirst($name) . ":</strong> "  . $qty . "</p>\n";
        }
        }
    }
  }
}