Добавление рекурсивной функциональности в сценарий слияния json в php

#php

#php

Вопрос:

Как мне рекурсивно получить доступ ко всем файлам json?

Приведенный ниже код находит все файлы json в одном каталоге и объединяет их в один файл. Теперь у меня есть иерархическая структура папок, как мне адаптировать следующее, чтобы перебирать все каталоги в корневом каталоге json/bones ?

 <?php
    $files = glob("json/bones/*.json");
    //Create an empty new array
    $newDataArray = [];
    //Get the contents of each file
    foreach($files as $file){
        $thisData = file_get_contents($file);
        //Decode the json
        $thisDataArray = json_decode($thisData);
        //Add $thisData to the new array
        $newDataArray[] = $thisDataArray;
    }
    //Encode the array to JSON
    $newDataJSON = json_encode($newDataArray);
    file_put_contents("json/data.json",$newDataJSON);
?>
 

редактировать — новый код:

 <?php
    $directory = ("json/data/")
    $scan_dir = scandir ( string $directory [, int $sorting_order = SCANDIR_SORT_ASCENDING [, resource $context ]] ) : array;
      //Create an empty new array


    $newDataArray = [];
    //Get the contents of each file
    // foreach($files as $file){
    foreach($scan_dir as $file){
       $thisData = file_get_contents($file);
        //Decode the json
        $thisDataArray = json_decode($thisData);
        //Add $thisData to the new array
        $newDataArray[] = $thisDataArray;
    }
    //Encode the array to JSON
    $newDataJSON = json_encode($newDataArray);
    file_put_contents("json/data.json",$newDataJSON);
?>
 

Дальнейшее редактирование:

Теперь это выдает ошибку разрешений file_get_contents(.): failed to open stream: Permission denied , с которой раньше проблем не было.

 <?php
  $dir = "../../json/data/";
  echo "<p>directory: ".$dir."</p>";
  $files = scandir($dir);
  //Create an empty new array
  $newDataArray = [];
  //Get the contents of each file
  // foreach($files as $file){
  foreach($files as $file){
      $thisData = file_get_contents($file);
      //Decode the json
      $thisDataArray = json_decode($thisData);
      //Add $thisData to the new array
      $newDataArray[] = $thisDataArray;
  }
  //Encode the array to JSON
  $newDataJSON = json_encode($newDataArray);
  file_put_contents("data.json",$newDataJSON);
?>
 

Комментарии:

1. рекурсивная выборка всех файлов — источник: php.net это может быть полезно.

2. Итак, чтобы получить массив путей к файлам: $directory = («json/bones/») $scan_dir = scandir ( строка $directory [, int $sorting_order = SCANDIR_SORT_ASCENDING [, ресурс $context ]] ) : массив

3. Тогда я бы foreach($scan_dir as $file){ забрал все файлы, тогда мне пришлось бы добавить фильтр?

4. Я получаю Parse error: syntax error, unexpected '$scan_dir' (T_VARIABLE) in G:Driveserversxampphtdocsbonifybonify2_0_2appsettingseditget_json.php on line 5 , я добавлю новый код в редактирование.

5. Используйте RecursiveDirectoryIterator, предоставляемый spl php.net/manual/en/class.recursivedirectoryiterator.php#97228

Ответ №1:

Это сделало свое дело

 $rii = new RecursiveIteratorIterator(new RecursiveDirectoryIterator('../../json/data/'));

$files = array();

foreach ($rii as $file) {
    if ($file->isDir()){
        continue;
    }
    $files[] = $file->getPathname();
}

var_dump($files);



  // $dir = "../../json/data/";
  // echo "<p>directory: ".$dir."</p>";
  // $files = scandir($dir);
  //Create an empty new array
  $newDataArray = [];
  //Get the contents of each file
  // foreach($files as $file){
  foreach($files as $file){
      $thisData = file_get_contents($file);
      //Decode the json
      $thisDataArray = json_decode($thisData);
      //Add $thisData to the new array
      $newDataArray[] = $thisDataArray;
  }
  //Encode the array to JSON
  $newDataJSON = json_encode($newDataArray);
  file_put_contents("gfgdata.json",$newDataJSON);