重新排列多维数组(添加一个维度)

时间:2014-09-17 09:55:03

标签: php arrays multidimensional-array

我在这里有一个棘手的问题:那里有一个像

这样的形式的多维数组
Array
(
    [0] => Array
        (
            [path] => /folder/subfolder1/
            [filename] => file1
        )

    [1] => Array
        (
            [path] => /folder/
            [filename] => file2
        )

    [2] => Array
        (
            [path] => /folder/subfolder2/
            [filename] => file3
        )
)

现在我想重新排列它,以便映射给定的文件夹结构。例如。在这种情况下有

Array
(
    ['folder'] => Array
        (
            [0] => Array
                (
                    [path] => /folder/
                    [filename] => file2
                )

            ['subfolder1'] => Array
                (
                    [0] => Array
                        (
                            [path] => /folder/subfolder1
                            [filename] => file1
                        )
                )

            ['subfolder2'] => Array
                (
                    [0] => Array
                        (
                            [path] => /folder/subfolder2
                            [filename] => file3
                        )
                )
        )
)

有一种简单的方法吗?我已经尝试过使用array_map()而我已经尝试将[]组合在一个foreach {}中,但我完全被困在这里。而且我已经对这件事情进行了长时间的讨论,以至于我害怕我再也看不到树木了。

1 个答案:

答案 0 :(得分:2)

这应该可以满足您的需求:

如果您需要一些解释,请告诉我。我觉得递归足够解释。当然你可以在某些时候使用一些PHP内置函数来解析你的数组,但是当你必须处理复杂的结构和递归时,你可以通过一些常规的foreach,imo来更清楚地做到这一点。

$array[0]['path'] = '/folder/';
$array[0]['filename'] = 'file1';
$array[1]['path'] = '/folder/sub1';
$array[1]['filename'] = 'file2';
$array[2]['path'] = '/folder/sub2';
$array[2]['filename'] = 'file3';
$array[3]['path'] = '/folder/sub2/sub3';
$array[3]['filename'] = 'file4';
$array[4]['path'] = '/folder/sub2/sub3';
$array[4]['filename'] = 'file5';
$array[5]['path'] = '/folder/';
$array[5]['filename'] = 'file6';

function add_element_to_folder (&$new_array, $path, $filename) {
  $folder = array_shift($path);
  if (empty($path)) {
    $new_array[$folder][] = $filename;
  } else {
    add_element_to_folder ($new_array[$folder], $path, $filename);
  }
}

$new_array = array();
foreach ($array as $value) {
  $path = array_filter(explode('/', $value['path']));
  add_element_to_folder($new_array, $path, $value['filename']);
}

var_dump($new_array);

输出:

Array
(
    [folder] => Array
        (
            [0] => file1
            [sub1] => Array
                (
                    [0] => file2
                )

            [sub2] => Array
                (
                    [0] => file3
                    [sub3] => Array
                        (
                            [0] => file4
                            [1] => file5
                        )

                )

            [1] => file6
        )

)