検索
ホームページバックエンド開発PHPチュートリアルPHP は反復を使用してフォルダー関連の操作 (コピー、削除など) を実装します。

この記事では、主に、反復に基づいてフォルダーのコピー、削除、サイズの確認などの操作を実現するための PHP の方法を紹介します。反復の原理を簡単に説明し、フォルダーのコピー、削除、サイズの確認を実現するための反復アルゴリズムの使用方法を分析します。一般的な操作の関連実装スキルについては、必要な友人が参照できるようにします

この記事では、PHP が反復に基づいてフォルダーのコピー、削除、サイズ表示などの操作を実装する方法について説明します。参考のために皆さんと共有してください。詳細は次のとおりです。

前回の記事 PHP は、フォルダーのコピー、削除、サイズのチェック操作を再帰的に実装します。 ここでは、反復操作のテクニックを分析してみましょう。

「再帰でうまく解決できるのに、なぜ反復を使うのですか?」主な理由は効率の問題です...

再帰の概念は、関数自体を呼び出して、複雑な問題を複数の類似したサブ問題に分解して解決することです。これにより、コードの量が大幅に削減され、プログラムが非常にエレガントに見えるようになります。 。

システムは関数呼び出しごとに実行領域を割り当て、スタックプッシュを使用してそれを記録するためです。関数呼び出しが終了した後、システムはスペースを解放し、スタックをポップしてブレークポイントを復元する必要があります。したがって、再帰のコストは依然として比較的大きいです。

たとえ言語設計が関数呼び出しを完全に最適化しており、再帰によって引き起こされるリソースの無駄が無視できる場合でも、再帰の深さは依然としてシステムのスタック容量によって制限され、そうでない場合は StackOverflowError がスローされます。

そして、繰り返し処理に適したコンピュータの特性をうまく利用できるのが反復であり、理論的にはすべての再帰関数を反復関数に変換できるので、再帰なしでできる場合はiteration replaceを使います。

フォルダーのサイズを表示

反復の考え方は、コンピューターに一連の命令を繰り返し実行させることです。この一連の命令が実行されるたびに、他の新しい値が元の値から導出されます。変数の... これを繰り返します。 終了条件に達するか、新しい値が生成されなくなるまで、プロセスが続行されます。

再帰はループとスタックに相当するため、スタックを反復で使用して再帰と反復を変換できます。


/**
 * 文件夹大小
 * @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;
}

フォルダをコピー

反復も再帰も、変数の初期化、終了条件の判断、実際の操作の実行、新しい変数の生成という4つのステップがありますが、場所が異なります。

たとえば、変数を初期化するステップは反復では関数の先頭にありますが、再帰では他の関数にパラメータを渡すプロセスを指します

終了条件を判断するステップは反復で使用されます。再帰の終了位置を決定するために再帰で使用されるループ Continue かどうかを判断します。

新しい変数を生成するステップの前に、実際の操作を実行することが再帰と反復の両方において関数の中心部分です。は反復の継続の条件です。再帰では、次の再帰の基礎となり、新しい変数の生成により再帰または反復が継続します。

/**
 * 复制文件夹
 * @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));
}

実行時間の表示これは、コードの実行時間(ミリ秒)を表示し、コールバックを通じて対象のコード(または関数)を実行し、最終的に実行時間(ミリ秒)を計算する関数です。このツールを使用すると、機能間のパフォーマンスの差を比較できます。これは非常にシンプルで実用的なツールです。

りー

以上がPHP は反復を使用してフォルダー関連の操作 (コピー、削除など) を実装します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
PHPセッションを失敗させる可能性のあるいくつかの一般的な問題は何ですか?PHPセッションを失敗させる可能性のあるいくつかの一般的な問題は何ですか?Apr 25, 2025 am 12:16 AM

PHPSESSIONの障害の理由には、構成エラー、Cookieの問題、セッションの有効期限が含まれます。 1。構成エラー:正しいセッションをチェックして設定します。save_path。 2.Cookieの問題:Cookieが正しく設定されていることを確認してください。 3.セッションの有効期限:セッションを調整してください。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は警告を発し、セッションが開始されたことを促します。 2)セッションデータの予期しない上書きを引き起こす可能性があります。 3)session_status()を使用してセッションステータスを確認して、繰り返しの呼び出しを避けます。

PHPでセッションのライフタイムをどのように構成しますか?PHPでセッションのライフタイムをどのように構成しますか?Apr 25, 2025 am 12:05 AM

PHPでのセッションライフサイクルの構成は、session.gc_maxlifetimeとsession.cookie_lifetimeを設定することで達成できます。 1)session.gc_maxlifetimeサーバー側のセッションデータのサバイバル時間を制御します。 0に設定すると、ブラウザが閉じているとCookieが期限切れになります。

セッションを保存するためにデータベースを使用することの利点は何ですか?セッションを保存するためにデータベースを使用することの利点は何ですか?Apr 24, 2025 am 12:16 AM

データベースストレージセッションを使用することの主な利点には、持続性、スケーラビリティ、セキュリティが含まれます。 1。永続性:サーバーが再起動しても、セッションデータは変更されないままになります。 2。スケーラビリティ:分散システムに適用され、セッションデータが複数のサーバー間で同期されるようにします。 3。セキュリティ:データベースは、機密情報を保護するための暗号化されたストレージを提供します。

PHPでカスタムセッション処理をどのように実装しますか?PHPでカスタムセッション処理をどのように実装しますか?Apr 24, 2025 am 12:16 AM

PHPでのカスタムセッション処理の実装は、SessionHandlerInterfaceインターフェイスを実装することで実行できます。具体的な手順には、次のものが含まれます。1)CussentsessionHandlerなどのSessionHandlerInterfaceを実装するクラスの作成。 2)セッションデータのライフサイクルとストレージ方法を定義するためのインターフェイス(オープン、クローズ、読み取り、書き込み、破壊、GCなど)の書き換え方法。 3)PHPスクリプトでカスタムセッションプロセッサを登録し、セッションを開始します。これにより、データをMySQLやRedisなどのメディアに保存して、パフォーマンス、セキュリティ、スケーラビリティを改善できます。

セッションIDとは何ですか?セッションIDとは何ですか?Apr 24, 2025 am 12:13 AM

SessionIDは、ユーザーセッションのステータスを追跡するためにWebアプリケーションで使用されるメカニズムです。 1.ユーザーとサーバー間の複数のインタラクション中にユーザーのID情報を維持するために使用されるランダムに生成された文字列です。 2。サーバーは、ユーザーの複数のリクエストでこれらの要求を識別および関連付けるのに役立つCookieまたはURLパラメーターを介してクライアントに生成および送信します。 3.生成は通常、ランダムアルゴリズムを使用して、一意性と予測不可能性を確保します。 4.実際の開発では、Redisなどのメモリ内データベースを使用してセッションデータを保存してパフォーマンスとセキュリティを改善できます。

ステートレス環境(APIなど)でセッションをどのように処理しますか?ステートレス環境(APIなど)でセッションをどのように処理しますか?Apr 24, 2025 am 12:12 AM

APIなどのステートレス環境でのセッションの管理は、JWTまたはCookieを使用して達成できます。 1。JWTは、無国籍とスケーラビリティに適していますが、ビッグデータに関してはサイズが大きいです。 2.cookiesはより伝統的で実装が簡単ですが、セキュリティを確保するために慎重に構成する必要があります。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強力な PHP 統合開発環境

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

このプロジェクトは osdn.net/projects/mingw に移行中です。引き続きそこでフォローしていただけます。 MinGW: GNU Compiler Collection (GCC) のネイティブ Windows ポートであり、ネイティブ Windows アプリケーションを構築するための自由に配布可能なインポート ライブラリとヘッダー ファイルであり、C99 機能をサポートする MSVC ランタイムの拡張機能が含まれています。すべての MinGW ソフトウェアは 64 ビット Windows プラットフォームで実行できます。

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター