2012-04-17 3 views
0

У меня возникла проблема с созданием массива папок типа структуры из массива.Создание массива папок рекурсивно из списка папок

Это массив функция получает

Array 
(
[0] => Array 
    (
     [id] => 6 
     [name] => 2011 
     [parent_folder] => 1 
    ) 

[1] => Array 
    (
     [id] => 5 
     [name] => 2012 
     [parent_folder] => 1 
    ) 

[2] => Array 
    (
     [id] => 7 
     [name] => April 
     [parent_folder] => 6 
    ) 

[3] => Array 
    (
     [id] => 2 
     [name] => Folder2 
     [parent_folder] => 
    ) 

[4] => Array 
    (
     [id] => 1 
     [name] => Folder1 
     [parent_folder] => 
    ) 
) 

Выход должен быть массив, где вложенные папки хранятся в виде массивов под ключ «содержимое» внутри массива их partent_folder в

Array 
(
[0] => Array 
    (
     [id] => 2 
     [name] => Folder2 
     [parent_folder] => 
    ) 

[1] => Array 
    (
     [id] => 1 
     [name] => Folder1 
     [parent_folder] => 
     [content] => Array 
      (
       [0] => Array 
        (
         [id] => 6 
         [name] => 2011 
         [parent_folder] => 1 
         [content] => Array 
          (
           [0] => Array 
            (
             [id] => 7 
             [name] => April 
             [parent_folder] => 6 
            ) 
          ) 
        ) 

       [1] => Array 
        (
         [id] => 5 
         [name] => 2012 
         [parent_folder] => 1 
        ) 

      ) 
    ) 
) 

Я попытался вокруг но не может заставить его работать. Должен быть рекурсивный способ переупорядочения массива. Может ли кто-нибудь помочь? Был бы благодарен!

+0

Как вы получаете свой список файлов? – RageD

+0

Возможный дубликат [Как преобразовать серию отношений родитель-потомок в иерархическое дерево?] (Http://stackoverflow.com/questions/2915748/how-can-i-convert-a-series-of-parent -child-relationship-in-a-hierarchical-tre) - и, пожалуйста, не вставляйте 'print_r', а' var_export'. – hakre

+0

@RageD база данных mysql – danielheinrich

ответ

0

Вам нужно что-то настроить так:

function look_through_array($array) { 
for ($i=0; $i<sizeof($array); $i++) { 
    if (is_array($array[$i])) 
     look_through_array($array[$i]); 
    else 
     create_folder($array[$i]); 
} 
} 

function create_folder($array) { 
    # make a folder 
} 
1

Допустим, что ваш исходный массив называется

$tree; 

Каждый элемент есть массив и имеет три именованных записи:

  1. id - представляющий себя - далее по названию $idName,
  2. name - некоторая строка - далее называется $parentName,
  3. parent - представляющий родители - далее называется $childrenName

онижения от квартиры в дерево, каждый дети должны быть в состоянии решать его родители. Поэтому создается временный массив, который имеет псевдоним для каждого элемента дерева по его идентификатору. Я называю его вскоре $t и создать его:

foreach ($tree as $k => $v) 
    $t[$v[$idName]] = &$tree[$k]; 

Как сейчас дети могут быть отнесены к его родителя (если родитель не FALSE) благодаря этой таблице псевдонимов, повторно расположение довольно прямо вперед:

foreach ($tree as $k => $v) 
    if (($p = $v[$parentName]) && ($t[$p][$childrenName][] = &$t[$v[$idName]])) 
     unset($tree[$k]); 

После этого было сделано, псевдоним таблицы больше не нужны и может быть снята с охраны:

unset($t); 

вуаля, дерево готово:

var_dump($tree); 

Выход:

array(2) { 
    [3]=> array(3) { 
    ["id"]=> string(1) "2" 
    ["name"]=> string(7) "Folder2" 
    ["parent_folder"]=> NULL 
    } 
    [4]=> array(4) { 
    ["id"]=> string(1) "1" 
    ["name"]=> string(7) "Folder1" 
    ["parent_folder"]=> NULL 
    ["content"]=> array(2) { 
     [0]=> array(4) { 
     ["id"]=> string(1) "6" 
     ["name"]=> string(4) "2011" 
     ["parent_folder"]=> string(1) "1" 
     ["content"]=> array(1) { 
      [0]=> array(3) { 
      ["id"]=> string(1) "7" 
      ["name"]=> string(5) "April" 
      ["parent_folder"]=> string(1) "6" 
      } 
     } 
     } 
     [1]=> array(3) { 
     ["id"]=> string(1) "5" 
     ["name"]=> string(4) "2012" 
     ["parent_folder"]=> string(1) "1" 
     } 
    } 
    } 
} 
0

Я знаю, этот вопрос старый, но ответ при условии, не работает для меня. Первая часть решения была получена из ответа Хакре. Это то, что я в конечном итоге делает:

global $t; 

foreach ($tree as $key => $value){ 
    $idName = $value['id']; 
    $t[$idName] = $tree[$key]; 
} 

foreach ($t as $key => $value){ 
    //echo $value['name'] . '<br />'; 
    $t[$key]['uri'] = recursiveArray($value).'/'.$value['name']; 
    //echo '<br />'; 
} 

function recursiveArray($value) { 
    global $t;  

     if ($value['parentId'] != 0){    
      $parentName = $t[$value['parentId']]['name']; 
      //$parentId = $value['parentId']; 
      return recursiveArray($t[$value['parentId']]).'/'.$parentName; 
     }   
     return ''; 
} 

tree является массив, который выглядит точно так же, как массив в OP в. Результат визуально отличается тем, что вместо вложенных массивов вложенность файлов возвращается в значение uri для каждого массива.

[76] => Array 
    (
     [id] => 76 
     [parentId] => 17 
     [name] => Evite Templates 
     [uri] => /Resources/Tools and Forms/General Tools and Forms/Countdown Events/Evite Templates 
    ) 

[79] => Array 
    (
     [id] => 79 
     [parentId] => 90 
     [name] => Celebration Meeting 
     [uri] => /Resources/Tools and Forms/General Tools and Forms/Celebration Meeting 
    ) 

[80] => Array 
    (
     [id] => 80 
     [parentId] => 90 
     [name] => Recruitment Meeting 
     [uri] => /Resources/Tools and Forms/General Tools and Forms/Recruitment Meeting 
    ) 
Смежные вопросы