PHP:遍历多维数组(4D)

问题描述 投票:1回答:1

我有一个如下所示的多维数组。它模仿一个基于./ 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>";
        }
    }
}

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

档案A:年:2020月:05一天:12档案B:年:2019月:12一天:22文件C:年:2019月:05日:19

目标是将其与另一个循环一起运行,该循环检查“ is_file”并显示输出。

php for-loop multidimensional-array foreach
1个回答
0
投票

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

您必须对此进行调整,但希望该概念会有所帮助。

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)


0
投票

通过使用带有foreach迭代器的一系列嵌套key => value,您可以获得所需的输出;关键是直到循环最底之前才输出日期部分:

foreach ($post_search as $year => $months) {
    foreach ($months as $month => $days) {
        foreach ($days as $day => $files) {
            foreach ($files as $file) {
                echo "File $file:\nYear: $year\nMonth: $month\nDay: $day\n";
            }
        }
    }
}

输出(用于样本数据):

File default.md:
Year: 2019
Month: 5
Day: 12
File default.md:
Year: 2019
Month: 12
Day: 22
File default.md:
Year: 2020
Month: 5
Day: 19

Demo on 3v4l.org

© www.soinside.com 2019 - 2024. All rights reserved.