У меня есть один хитрый здесь: есть многомерный массив в форме, как
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 {}, но я полностью застрял здесь. И я размышлял над этим так долго, что боюсь, что больше не вижу леса для деревьев.
Это должно сделать то, что вы ищете:
Дайте мне знать, если вам нужны объяснения. Я чувствовал, что рекурсивное объяснение достаточно. Конечно, в какой-то момент вы можете использовать некоторые встроенные функции 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
)
)
Других решений пока нет …