ホームページ  >  記事  >  バックエンド開発  >  PHPは反復に基づいてフォルダーのコピー、削除、表示サイズなどを実装します

PHPは反復に基づいてフォルダーのコピー、削除、表示サイズなどを実装します

墨辰丷
墨辰丷オリジナル
2018-05-18 14:55:201249ブラウズ

この記事では、主に、反復に基づいてフォルダーのコピー、削除、サイズの確認などの操作を実現するための 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));
}

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

/**
 * 函数执行毫秒数
 * @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 は、関数の静的変数を使用して、指定された

反復数を実装します手順 詳しい説明

PHP

Iterator使い方の詳しい説明

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。