亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

PHP:遍歷多維數組 (4D)

PHP:遍歷多維數組 (4D)

PHP
長風秋雁 2023-04-02 10:42:20
我有一個結構如下的多維數組。它模擬了一個文件結構,該文件結構基于./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>";        }    }}我正在尋找迭代多維數組的最佳方法。謝謝。我想要的輸出是這樣的:File A:Year: 2020Month: 05Day: 12File B:Year: 2019Month: 12Day: 22File C:Year: 2019Month: 05Day: 19目標是將其與另一個檢查“is_file”并顯示輸出的循環一起運行。
查看完整描述

2 回答

?
慕姐4208626

TA貢獻1852條經驗 獲得超7個贊

通過使用一系列嵌套的foreachwithkey => 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


查看完整回答
反對 回復 2023-04-02
?
小怪獸愛吃肉

TA貢獻1852條經驗 獲得超1個贊

使用函數來處理令人困惑的嵌套方面應該會有很大幫助。我的例子絕不是一個可靠的解決方案。就個人而言,我可能會將這些函數放在一個類中并使其面向對象......但這絕對不是適合所有情況的正確解決方案。


您必須對此進行調整,但希望這個概念對您有所幫助。


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).


查看完整回答
反對 回復 2023-04-02
  • 2 回答
  • 0 關注
  • 174 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號