2015-01-31 4 views
0

У меня есть некоторые категории, которые мне нужно преобразовать в вложенный массив (дерево). Я использую материализованный путь для создания дерева, и я работаю на PHP. Вот print_r того, что у меня есть:Преобразование плоского массива в вложенный массив с использованием материализованного пути

Array 
(
    [0] => Array 
     (
      [_id] => mac 
      [name] => Mac 
      [path] => null 
     ) 

    [1] => Array 
     (
      [_id] => ipod 
      [name] => iPod 
      [path] => null 
     ) 

    [2] => Array 
     (
      [_id] => imac 
      [name] => iMac 
      [path] => ,mac, 
     ) 

    [3] => Array 
     (
      [_id] => imac2001 
      [name] => iMac 2001 
      [path] => ,mac,imac, 
     ) 

    [4] => Array 
     (
      [_id] => imac2002 
      [name] => iMac 2002 
      [path] => ,mac,imac, 
     ) 

    [5] => Array 
     (
      [_id] => imac2003 
      [name] => iMac 2003 
      [path] => ,mac,imac, 
     ) 

) 

Я попытался сделать это, но я заблудиться в целом идея рекурсивной функции.

UPDATE:

Вот что я хотел бы иметь в конечном счете:

Array 
(
    [0] => Array 
     (
      [_id] => mac 
      [name] => Mac 
      [path] => null 
      [children] => 
       [0] => Array 
        (
         [_id] => imac 
         [name] => iMac 
         [path] => ,mac, 
         [children] => 
          [0] => Array 
           (
            [_id] => imac2001 
            [name] => iMac 2001 
            [path] => ,mac,imac, 
           ) 

          [1] => Array 
           (
            [_id] => imac2002 
            [name] => iMac 2002 
            [path] => ,mac,imac, 
           ) 

          [2] => Array 
           (
            [_id] => imac2003 
            [name] => iMac 2003 
            [path] => ,mac,imac, 
           ) 
        ) 
     ) 

    [1] => Array 
     (
      [_id] => ipod 
      [name] => iPod 
      [path] => null 
     ) 
) 

Я хотел бы показать вам, что я уже закодированы, но это далеко от не работает так ничего хорошего, чтобы увидеть в моем мнение.

+0

Итак, мы видим, что у вас есть. Но вопросы: что вам нужно ** и что вы ** сделали **? –

+0

Хорошо, я обновил свой пост. –

+0

Должен ли он быть массивом или же он может быть объектом? Кроме того, массив всегда в правильном порядке? Итак, пути следуют друг за другом? –

ответ

0

Я нашел решение. Он работает для меня, так вот вот:

<?php 

$categories = Array 
(
    [0] => Array 
     (
      ["_id"] => "mac" 
      ["name"] => "Mac" 
      ["path"] => null 
     ) 

    [1] => Array 
     (
      ["_id"] => "ipod" 
      ["name"] => "iPod" 
      ["path"] => null 
     ) 

    [2] => Array 
     (
      ["_id"] => "imac" 
      ["name"] => "iMac" 
      ["path"] => ",mac," 
     ) 

    [3] => Array 
     (
      ["_id"] => "imac2001" 
      ["name"] => "iMac 2001" 
      ["path"] => ",mac,imac," 
     ) 

    [4] => Array 
     (
      ["_id"] => "imac2002" 
      ["name"] => "iMac 2002" 
      ["path"] => ",mac,imac," 
     ) 

    [5] => Array 
     (
      ["_id"] => "imac2003" 
      ["name"] => "iMac 2003" 
      ["path"] => ",mac,imac," 
     ) 
) 

$categoriesNested = sortTree($categories); 

function sortTree(&$categories, $parent = null) 
{ 
    $result = array(); 

    foreach($categories as $key => $cat) 
    { 
     if($parent == null) 
     { 
      $temp = $cat; 
      unset($categories[$key]); 
      $temp["children"] = $this->sortTree($categories, $cat); 
      $result[] = $temp; 
     } 
     else 
     { 
      $tempPath = array_values(array_filter(explode(',', $cat["path"]))); 
      $directParent = array_pop($tempPath); 
      if ($parent["_id"] == $directParent) 
      { 
       $temp = $cat; 
       unset($categories[$key]); 
       $temp["children"] = $this->sortTree($categories, $cat); 
       $result[] = $temp; 
      } 
     } 
    } 

    if (empty($result)) 
     return null; 
    else 
     return $result; 
} 

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

  • Нет связанных вопросов^_^