Перестановка многомерного массива (добавление одного измерения)

У меня есть один хитрый здесь: есть многомерный массив в форме, как

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 {}, но я полностью застрял здесь. И я размышлял над этим так долго, что боюсь, что больше не вижу леса для деревьев.

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
)

)
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]