PHP 資料夾操作 複製 刪除 檢視大小 迭代實現

2022-03-16 19:57:57 字數 2448 閱讀 2295

「既然遞迴能很好的解決,為什麼還要用迭代呢」?主要的原因還是效率問題……

遞迴的概念是函式呼叫自身,把乙個複雜的問題分解成與其相似的多個子問題來解決,可以極大的減少**量,使得程式看起來非常優雅。

由於系統要為每次函式呼叫分配執行空間,並使用壓棧予以記錄。在函式呼叫結束後,系統需要釋放空間,並彈棧恢復斷點。所以遞迴的消耗還是比較大的。

即使語言設計時已經將函式呼叫優化的極度完美,達到可以忽略遞迴造成的資源浪費,但是遞迴的深度仍然會受到系統棧容量的限制,否則將會丟擲 stackoverflowerror 錯誤。

而迭代能很好的利用計算機適合做重複操作的特點,並且從理論上說,所有的遞迴函式都可以轉換為迭代函式,所以盡量能不用遞迴就不用遞迴,能用迭代代替就用迭代代替。

********************檢視資料夾大小********************=

迭代的思路是讓計算機對一組指令進行重複執行,在每次執行這組指令時,都從變數的原值推出其它的新值……重複這一過程直到達到結束條件或沒有新值產生。

由於遞迴相當於迴圈加堆疊,所以可以在迭代中使用堆疊來進行遞迴和迭代的轉換。

/*

* * 資料夾大小

* @param $path

* @return int */

function dirsize($path)

else

/*迭代條件

*/while (count($stack) !== 0)

closedir($handle

); }

return

$size

;}

********************=複製資料夾=********************=

迭代和遞迴都具有初始化變數、判斷結束條件、執行實際操作、產生新變數這四個步驟,只不過所在的位置不同罷了。

比如初始化變數這一步驟,在迭代中是位於函式的開始部分,而在遞迴中是指其他函式傳遞引數這一過程;

判斷結束條件這一步驟,在迭代中用於判斷迴圈是否繼續,在遞迴中用於判斷遞迴的結束位置;

執行實際操作在遞迴和迭代中都是函式的核心部分,位於產生新變數步驟之前;

產生新變數在迭代中是迭代繼續的條件,在遞迴中是下一次遞迴的基礎,由於產生了新變數才使得遞迴或迭代繼續進行。

/*

* * 複製資料夾

* @param $source

* @param $dest

* @return string */

function copydir($source, $dest

)

/*迭代條件

*/while (count($stack) !== 0)

closedir($handle

); }

return

$target

;}

********************=刪除資料夾=********************=

拋開語言特性影響效能最多的就是冗餘**了,冗餘**通常是由於設計不到位而產生的。

多數情況下遞迴要比迭代冗餘**更多,這也是造成遞迴效率低的一大因素。

但當遞迴**足夠簡練,冗餘度足夠低時,迭代的效能未必就比遞迴高。

比如這個用迭代實現的資料夾刪除函式,速度就比遞迴要慢20%,主要原因是空資料夾的判斷,在遞迴中當資料夾沒有子資料夾時,函式會直接刪除所有檔案和當前資料夾,遞迴結束。

在迭代中即使資料夾為空也需要將其存入堆疊,下次迭代時再判斷是否為空,之後才能刪除。這就相比遞迴多了判斷檔案為空、存入堆疊、取出迭代等冗餘操作,所以處理速度會比遞迴更慢。

/*

* * 刪除資料夾

* @param $path

* @return bool */

function rmdirs($path

)

/*執行過程

*/foreach ($items

as$item

) }

return !(file_exists($path

));}

********************檢視執行時間********************==

這是乙個檢視**執行時間(毫秒數)的函式,通過**方式執行目標**(或函式),最終計算出執行的時間(毫秒)。通過這個工具可以對比函式之間的效能差距,非常簡單實用的乙個小工具。

/*

* * 函式執行毫秒數

* @param $func

* @return int */

function exec_time($func

)echo exec_time(function

() );

PHP 資料夾操作 複製 刪除 檢視大小 遞迴實現

php雖然提供了 filesize copy unlink 等檔案操作的函式,但是沒有提供 dirsize copydir rmdirs 等資料夾操作的函式 rmdir也只能刪除空目錄 所以只能手動編寫這些函式,主要的技巧是通過遞迴將問題逐層分解,直到分解成可以直接解決的最小子問題。檢視資料夾大小 ...

php檔案及資料夾操作(建立 刪除 移動 複製)

建立fileutil.php檔案,內容及呼叫方式如下 操縱檔案類 例子 fileutil createdir a 1 2 3 測試建立資料夾 建乙個a 1 2 3資料夾 fileutil createfile b 1 2 3 測試建立檔案 在b 1 2 資料夾下面建乙個3檔案 fileutil cr...

python 遞迴刪除資料夾 遞迴複製資料夾

學過python os模組的人都知道python中的rmdir 函式只能刪除乙個空的資料夾,而remove 函式也只能刪除單個的檔案,沒有乙個現成的方法來刪除乙個資料夾 裡面有檔案 所以我們要借助遞迴去刪除乙個資料夾中的每乙個檔案 或者資料夾 下面是 遞迴刪除資料夾 import os defdel...