搜尋
首頁後端開發php教程PHP利用迭代實作資料夾相關操作(複製、刪除等)

這篇文章主要介紹了PHP基於迭代實現資料夾複製、刪除、查看大小等操作的方法,簡單說明了迭代的原理並結合實例形式分析了php採用迭代算法實現文件夾的複製、刪除及查看大小等常見操作的相關實作技巧,需要的朋友可以參考下

本文實例講述了PHP基於迭代實現資料夾複製、刪除、查看大小等操作的方法。分享給大家供大家參考,具體如下:

前面 PHP遞歸實現資料夾的複製、刪除、查看大小操作 分析了遞歸操作使用技巧,這裡再來分析一下迭代的操作技巧。

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

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

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

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

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

檢視資料夾大小

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

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


/**
 * 文件夹大小
 * @param $path
 * @return int
 */
function dirsize($path)
{
  /* 初始条件 */
  $size = 0;
  $stack = array();
  if (file_exists($path)) {
    $path = realpath($path) . '/';
    array_push($stack, '');
  } else {
    return -1;
  }
  /* 迭代条件 */
  while (count($stack) !== 0) {
    $dir = array_pop($stack);
    $handle = opendir($path . $dir);
    /* 执行过程 */
    while (($item = readdir($handle)) !== false) {
      if ($item == '.' || $item == '..') continue;
      $_path = $path . $dir . $item;
      if (is_file($_path)) $size += filesize($_path);
      /* 更新条件 */
      if (is_dir($_path)) array_push($stack, $dir . $item . '/');
    }
    closedir($handle);
  }
  return $size;
}

#複製資料夾

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

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

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

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

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


/**
 * 复制文件夹
 * @param $source
 * @param $dest
 * @return string
 */
function copydir($source, $dest)
{
  /* 初始条件 */
  $stack = array();
  $target = '';
  if (file_exists($source)) {
    if (!file_exists($dest)) mkdir($dest);
    $source = realpath($source) . '/';
    $dest = realpath($dest) . '/';
    $target = realpath($dest);
    array_push($stack, '');
  }
  /* 迭代条件 */
  while (count($stack) !== 0) {
    $dir = array_pop($stack);
    $handle = opendir($source . $dir);
    if (!file_exists($dest . $dir)) mkdir($dest . $dir);
    /* 执行过程 */
    while (($item = readdir($handle)) !== false) {
      if ($item == '.' || $item == '..') continue;
      $_source = $source . $dir . $item;
      $_dest = $dest . $dir . $item;
      if (is_file($_source)) copy($_source, $_dest);
      /* 更新条件 */
      if (is_dir($_source)) array_push($stack, $dir . $item . '/');
    }
    closedir($handle);
  }
  return $target;
}

刪除資料夾

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

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

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

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

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


/**
 * 删除文件夹
 * @param $path
 * @return bool
 */
function rmdirs($path)
{
  /* 初始化条件 */
  $stack = array();
  if (!file_exists($path)) return false;
  $path = realpath($path) . '/';
  array_push($stack, '');
  /* 迭代条件 */
  while (count($stack) !== 0) {
    $dir = end($stack);
    $items = scandir($path . $dir);
    /* 执行过程 */
    if (count($items) === 2) {
      rmdir($path . $dir);
      array_pop($stack);
      continue;
    }
    /* 执行过程 */
    foreach ($items as $item) {
      if ($item == '.' || $item == '..') continue;
      $_path = $path . $dir . $item;
      if (is_file($_path)) unlink($_path);
      /* 更新条件 */
      if (is_dir($_path)) array_push($stack, $dir . $item . '/');
    }
  }
  return !(file_exists($path));
}

查看執行時間

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


/**
 * 函数执行毫秒数
 * @param $func
 * @return int
 */
function exec_time($func)
{
  $start = explode(' ', microtime());
  $func();// 执行耗时操作
  $end = explode(' ', microtime());
  $sec_time = floatval($end[0]) - floatval($start[0]);
  $mic_time = floatval($end[1]) - floatval($start[1]);
  return intval(($sec_time + $mic_time) * 1000);
}
echo exec_time(function () {
  /* 执行的耗时操作 */
});

以上是PHP利用迭代實作資料夾相關操作(複製、刪除等)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
哪些常見問題會導致PHP會話失敗?哪些常見問題會導致PHP會話失敗?Apr 25, 2025 am 12:16 AM

PHPSession失效的原因包括配置錯誤、Cookie問題和Session過期。 1.配置錯誤:檢查並設置正確的session.save_path。 2.Cookie問題:確保Cookie設置正確。 3.Session過期:調整session.gc_maxlifetime值以延長會話時間。

您如何在PHP中調試與會話相關的問題?您如何在PHP中調試與會話相關的問題?Apr 25, 2025 am 12:12 AM

在PHP中調試會話問題的方法包括:1.檢查會話是否正確啟動;2.驗證會話ID的傳遞;3.檢查會話數據的存儲和讀取;4.查看服務器配置。通過輸出會話ID和數據、查看會話文件內容等方法,可以有效診斷和解決會話相關的問題。

如果session_start()被多次調用會發生什麼?如果session_start()被多次調用會發生什麼?Apr 25, 2025 am 12:06 AM

多次調用session_start()會導致警告信息和可能的數據覆蓋。 1)PHP會發出警告,提示session已啟動。 2)可能導致session數據意外覆蓋。 3)使用session_status()檢查session狀態,避免重複調用。

您如何在PHP中配置會話壽命?您如何在PHP中配置會話壽命?Apr 25, 2025 am 12:05 AM

在PHP中配置會話生命週期可以通過設置session.gc_maxlifetime和session.cookie_lifetime來實現。 1)session.gc_maxlifetime控制服務器端會話數據的存活時間,2)session.cookie_lifetime控制客戶端cookie的生命週期,設置為0時cookie在瀏覽器關閉時過期。

使用數據庫存儲會話的優點是什麼?使用數據庫存儲會話的優點是什麼?Apr 24, 2025 am 12:16 AM

使用數據庫存儲會話的主要優勢包括持久性、可擴展性和安全性。 1.持久性:即使服務器重啟,會話數據也能保持不變。 2.可擴展性:適用於分佈式系統,確保會話數據在多服務器間同步。 3.安全性:數據庫提供加密存儲,保護敏感信息。

您如何在PHP中實現自定義會話處理?您如何在PHP中實現自定義會話處理?Apr 24, 2025 am 12:16 AM

在PHP中實現自定義會話處理可以通過實現SessionHandlerInterface接口來完成。具體步驟包括:1)創建實現SessionHandlerInterface的類,如CustomSessionHandler;2)重寫接口中的方法(如open,close,read,write,destroy,gc)來定義會話數據的生命週期和存儲方式;3)在PHP腳本中註冊自定義會話處理器並啟動會話。這樣可以將數據存儲在MySQL、Redis等介質中,提升性能、安全性和可擴展性。

什麼是會話ID?什麼是會話ID?Apr 24, 2025 am 12:13 AM

SessionID是網絡應用程序中用來跟踪用戶會話狀態的機制。 1.它是一個隨機生成的字符串,用於在用戶與服務器之間的多次交互中保持用戶的身份信息。 2.服務器生成並通過cookie或URL參數發送給客戶端,幫助在用戶的多次請求中識別和關聯這些請求。 3.生成通常使用隨機算法保證唯一性和不可預測性。 4.在實際開發中,可以使用內存數據庫如Redis來存儲session數據,提升性能和安全性。

您如何在無狀態環境(例如API)中處理會議?您如何在無狀態環境(例如API)中處理會議?Apr 24, 2025 am 12:12 AM

在無狀態環境如API中管理會話可以通過使用JWT或cookies來實現。 1.JWT適合無狀態和可擴展性,但大數據時體積大。 2.Cookies更傳統且易實現,但需謹慎配置以確保安全性。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

將Eclipse與SAP NetWeaver應用伺服器整合。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版