更清洁循环通过PHP中的多维数组

时间:2018-04-03 09:58:47

标签: php

让我们假设您有一个多维数组,并假设它赢了:

    foreach ($Call as $key => $value) {

            echo "1.".(is_array($value) ? $key : $value)."<br>";

        if(is_array($value)){

            foreach ($value as $key => $value) {

                echo "a.".(is_array($value) ? $key : $value)."<br>";

                if(is_array($value)){

                    foreach ($value as $key => $value) {

                        echo "A.".(is_array($value) ? $key : $value)."<br>";

                    }

                }

            }

        }

    }

你如何回应数组中的每个Foo,Bar和Baz?由于Foo2的设置键为0,我特别遇到问题,因此我需要以某种方式解决在非关键值上设置的键。

我目前的解决方案虽然有效但感觉太骗了,并且想知道是否有更简洁的方法来循环播放阵列:

DEFAULT

2 个答案:

答案 0 :(得分:1)

对于使用递归的干净代码,我有以下解决方案。

$Call= array("Foo1" => array("Bar1" => array("Baz1", "Baz2")), "Foo2", "Foo3" => array("Bar2", "Bar3"));
cleanloop($Call);
function cleanloop($arr){
    foreach($arr as $key => $value){
        if(is_array($value)){
            echo $key . "<br/>";
            cleanloop($value);
        }else{
            echo $value . "<br/>";
        }
    }
}

我希望通过更多的努力,可以管理列表/编号。在编号中使用html buitl我可以像

一样更新
function cleanloop($arr){
    echo "<ol>";
    foreach($arr as $key => $value){
        if(is_array($value)){
            echo "<li>";
            echo $key;
            cleanloop($value);
            echo "</li>";
        }else{
            echo "<li>" . $value . "</li>";
        }
    }
    echo "</ol>";
}

答案 1 :(得分:1)

这是一个品味问题,但我不喜欢递归。

SPL iterators提供您所需要的一切:

<?php
$Call = array(
    "Foo1" => array(
        "Bar1" => array(
            "Baz1",
            "Baz2"
        )
    ),
    "Foo2",
    "Foo3" => array(
        "Bar2",
        "Bar3"
    )
);
$iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($Call), RecursiveIteratorIterator::SELF_FIRST);
for ($iterator->rewind(); $iterator->valid(); $iterator->next()) {
    echo 'Depth: ';
    echo $iterator->getDepth();
    echo ' Key: ';
    echo $iterator->key();
    echo ' Content: ';
    echo is_array($iterator->current()) ? 'Array' : $iterator->current();
    echo '; ' . PHP_EOL;
}

请查看constructor of the RecursiveIteratorIterator。它提供了一些有用的标志。