首页 > 解决方案 > 将多维数组转换为文件路径

问题描述

如何将多维数组转换为文件路径。我有这个数组:

$data = [
        "users" => [
                "joe" => [
                        "photos" => ["a.jpg","b.jpg"],
                        "files" => ["a.doc","b.doc"]
                ],
                "annie" => [
                    "photos" => ["a.jpg","b.jpg"],
                    "files" => ["a.doc","b.doc"]
                ],
        ]
];

我必须转换为路径示例:

"users/joe/photos/a.jpg";
"users/joe/photos/b.jpg";
"users/joe/files/a.doc";
"users/joe/files/b.doc";

"users/annie/photos/a.jpg";
"users/annie/photos/b.jpg";
"users/annie/files/a.doc";
"users/annie/files/b.doc";

但我不能用这个功能得到最好的结果:

$path = "";
function iterate($data, $path)
{
  echo "<br>";
    foreach ($data as $key => $item){
        if (is_array($item)){
            $path .= $key.DIRECTORY_SEPARATOR;
            iterate($item, $path);
        }else{
            echo $path.$item."<br>";
        }
    }
}

输出 :

users/joe/photos/a.jpg
users/joe/photos/b.jpg

users/joe/photos/files/a.doc
users/joe/photos/files/b.doc

users/joe/annie/photos/a.jpg
users/joe/annie/photos/b.jpg

users/joe/annie/photos/files/a.doc
users/joe/annie/photos/files/b.doc

请帮忙。

谢谢

标签: phpfilemultidimensional-array

解决方案


您可以使用RecursiveIteratorIterator+ RecursiveArrayIterator

function computeFilePaths(array $fileTree): array
{
  $filePaths = [];

  $iterator = new RecursiveIteratorIterator(new RecursiveArrayIterator($fileTree));
  foreach ($iterator as $fileName) {
    for ($folders = [], $pos = 0, $depth = $iterator->getDepth(); $pos < $depth; $pos++) {
      $folders[] = $iterator->getSubIterator($pos)->key();
    }
    $filePaths[] = implode('/', $folders) . '/' . $fileName;
  }

  return $filePaths;
}

print_r(computeFilePaths($yourArrayGoesHere));

我强烈建议选择这个问题的答案来了解这些迭代器是如何工作的。


推荐阅读