2014-09-17 2 views
2

У меня есть хитрый здесь: есть многомерный массив в форме, какПерегруппировка многомерного массива (добавление одного измерения)

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

Вы хотите, чтобы это работало на любой глубине, или это только на 2-х уровнях? Подумайте о том, чтобы добавить свои попытки, чтобы мы могли помочь вам и указать, где вы поступили неправильно. – Sugar

+1

Вам следует более точно объяснить, что вы хотите сделать. Мы не можем переделать массив, чтобы понять, чего вы действительно хотите. :) – gorgi93

+1

Я предполагаю, что он хочет вложить массив по пути из исходного массива. – YuS

ответ

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 
     ) 

) 
+0

Спасибо, это действительно красиво :) –

Смежные вопросы