PHP лучший способ вызвать функцию цикла несколько раз - PullRequest
0 голосов
/ 07 мая 2018

У меня есть определенный каталог, который может содержать zip файлов.

Я бы хотел просмотреть каждый подэлемент моего каталога, чтобы проверить, является ли это почтовым индексом. И распакуйте это. Затем обработайте остальные файлы.

Я использую flysystem для работы с моими файлами.

Итак, я пошел на это

$contents = $this->manager->listContents('local://my_directory , true);

foreach ($contents as $file) {
  if( $file['extension'] == 'zip')
    //Unzip in same location
}

Проблема в том, что разархивированные файлы не находятся в цикле и, если файл zip, содержат другой zip. Второй никогда не будет разархивирован.

Вот я и подумал об этом

function loopAndUnzip(){

    $contents = $this->manager->listContents('local_process://' . $dir['path'] , true);

    foreach ($contents as $file) {
      if( $file['extension'] == 'zip')
        //Unzip and after call loopAndUnzip()
    }
}

Но начальная функция никогда не будет завершена и будет вызываться снова и снова, если внутри zip есть zip. Разве это не проблема производительности?

Как управлять такими вещами?

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Вы можете использовать glob, чтобы найти их, и сделать функцию рекурсивной. Вы можете сделать это, начиная с определенного каталога, распаковать все файлы в него и проверить, есть ли новые почтовые индексы.
Я рекомендую также использовать рекурсивные каталоги. Если A.zip и B.zip оба имеют файл с именем example.txt, он перезаписывается. С dirs это не будет:

function unzipAll(string $dirToScan = "/someDir", $depth=0):void {
    if($depth >10 ){
        throw new Exception("Maximum zip depth reached");
    }
    $zipfiles = glob($dirToScan."*.zip");
    // Unzip all zips found this round:
    foreach ($zipfiles as $zipfile) {
        $zipLocation = "/".$zipname;
        // unzip here to $zipLocation

        // and now check if in the zip dir there is stuff to unzip:
        unzipAll($dirToScan.$zipLocation, ++$depth);
    }
}

Глубина в $ необязательна, но таким образом вы не можете забить себя до смерти.

0 голосов
/ 07 мая 2018

loopAndUnzip снова сделает всех файлов, так что вы просто снова распакуете тот же zip-файл и начнете заново со всей папкой до бесконечности.

Некоторые возможности:

  1. Храните список элементов, которые уже были обработаны или пропущены, и не обрабатывайте их снова, поэтому при выполнении итерации по $contents сохраните отдельный массив и получите что-то вроде:

PHP:

foreach ($contents as $file) {
  if (!array_search($processedFiles, $file) {
    if( $file['extension'] == 'zip')
      //Unzip in same location
  }

  $processedFiles[] = $file;
}
  1. Используйте распаковщик, который возвращает список созданных файлов / папок, чтобы вы могли явно обработать их вместо полного содержимого каталога.

  2. Если распаковщик не может этого сделать, вы можете подделать его, распаковав в другое место, получить список этого места, затем переместить все файлы в исходное место и обработать полученный список.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...