首页 > 解决方案 > PHP:遍历多维数组(4D)

问题描述

我有一个结构如下的多维数组。它模仿基于./YEAR/MONTH/DAY/FILE 存储文件的文件结构。

Array
(
    [2019] => Array
        (
            [05] => Array
                (
                    [12] => Array
                        (
                            [0] => default.md
                        )
                )

            [12] => Array
                (
                    [22] => Array
                        (
                            [0] => default.md
                        )
                )
        )

    [2020] => Array
        (
            [05] => Array
                (
                    [19] => Array
                        (
                            [0] => default.md
                        )
                )
        )
)

我正在尝试遍历整个数组并获取每个特定文件的值,同时还获取该指定文件的相关 YEAR、MONTH 和 DAY。

我的循环很遥远,因为我试图在 for 循环中嵌套多个 foreach 循环。我得到的兔子洞越深,我遇到的问题就越多

$post_search = directoryArrayMap("content"); //function that creates the array

$year = array_keys($post_search);

for($i = 0; $i < count($post_search); $i++ ) {
    echo $year[$i] . "<br>";
    foreach($post_search[$year[$i]] as $month => $day ) {
        echo $month[$i] . "<br>";
        foreach($post_search[$key[$month[$i]]] as $day => $post_file ) {
            echo $day . "<br>";
        }
    }
}

我正在寻找迭代多维数组的最佳方法。谢谢。我想要的输出是这样的:

档案一:
年份:2020
月:05
天数:12

文件 B:
年份:2019
月:12
天数:22

文件 C:
年份:2019
月:05
天数:19

目标是与另一个检查“is_file”并显示输出的循环一起运行它。

标签: phpfor-loopmultidimensional-arrayforeach

解决方案


使用函数来处理令人困惑的嵌套方面应该会有很大帮助。我的例子绝不是一个强大的解决方案。就个人而言,我可能会将函数放在一个类中并使其面向对象......但这绝对不是每种情况的正确解决方案。

你必须适应这个,但希望这个概念是有帮助的。

function handleYear($year,$arrOfMonths){
     echo $year;
     foreach ($arrOfMonths as $month=>$arrOfDays){
         handleMonth($month,$arrOfDays);
     }
}
function handleMonth($month,$arrOfDays){
     echo $month;
     foreach ($arrOfDays as $dayOfMonth=>$listOfFiles){
         handleDay($dayOfMonth,$listOfFiles);
     }
}

//to get started
foreach ($data as $year=>$arrOfMonths){
    echo $year;
    handleYear($year, $arrOfMonths);
}

您还可以修改子函数以接受父参数。喜欢handleMonth也可以拿在年,然后handleYear就过去了$year

编辑:
看到你想要的输出后......我建议将年份和月份传递给handleDay函数。然后handleDay可能是这样的:

function handleDay($day,$arrOfFiles,$year,$month) use (&$files){
    foreach ($arrOfFiles as $index=>$fileName){
        $file = ['year'=>$year,'month'=>$month,'day'=>$day];
        $files[] = $file; 
    }
}

然后,您需要在声明我没记错$files = []之前在函数外部声明。handleDay

但是,您将拥有一组可以轻松使用的文件。

就个人而言,我可能会辛辛苦苦想出一个更清洁的解决方案(use在这种情况下不喜欢这种说法,我什至可能没有正确使用它)。如果它在一个类中,那么您可以使用$this->files而不是use (&$files).


推荐阅读