2013-07-23 5 views
-1

В настоящее время у меня есть таблица так:Плоский массив многоуровневую структуру - PHP массив

+-----------+---------------+-------------+-------------+ 
| category | OrderID  | Name  | Name2  | 
+-----------+---------------+-------------+-------------+ 
| ABC  | 12345   | Pen   | Black  | 
+-----------+---------------+-------------+-------------+ 
| ABC  | 34545   | Pencil  | White  | 
+-----------+---------------+-------------+-------------+ 
| ABC  | 34545   | Pen   | Black  | 
+-----------+---------------+-------------+-------------+ 
| DEF  | 12345   | Pencil  | Black  | 
+-----------+---------------+-------------+-------------+ 
| DEF  | 12345   | Pen   | White  | 
+-----------+---------------+-------------+-------------+ 

Я хотел бы иметь это в виде дерева, которые я читал так много примеров на исх. и рекурсивным, но не понимающим понятий. Может кто-нибудь помочь?

Поскольку таблица будет огромным - возможно, около 20K записей - не уверен, что рекурсивный будет иметь никакого влияния на производительность и т.д.

я, чтобы он сделал в этом формате из-за ограничений виджета клиента HTML:

Array 
(
[0] => Array 
    (
     [category] => ABC 
     [children] => Array 
      (
      [0] => Array(
       [OrderID] => 12345 
       [children] => Array 
        (
         [Name] => Pen 
         [Name2] => Black 

        ) 
      ) 
      [1] => Array(
       [OrderID] => 34545 
       [children] => Array 
       (
        [0] => Array(
         [Name] => Pencil 
         [Name2] => White 
        ) 
        [1] => Array(
         [Name] => Pen 
         [Name2] => White 
        ) 
       ) 
      ) 

    ) 

[1] => Array 
    (
     [category] => DEF 
     [children] => Array 
      (
       [OrderID] => 12345 
       [children] => Array 
       (
        [0] => Array(
         [Name] => Pencil 
         [Name2] => Black 
        ) 
        [1] => Array(
         [Name] => Pen 
         [Name2] => White 
        ) 
       ) 
      ) 
    ) 
+2

Вы не пробовали что-либо AFAIK ... Проголосовал за вопрос вне темы, потому что вопросы, как ожидается, будут иметь минимальное понимание предмета –

+0

, если использовать «ABC» «DEF» в качестве ключа массив, было бы лучше как для доступа, так и для вставки. И, как и выше, вы должны попробовать, это не сложно – TroyCheng

ответ

0

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

$ori=json_decode(<<<JSON 
[{"category":"ABC","orderID":"12345","Name":"Pen","Name2":"Black"}, 
{"category":"ABC","orderID":"34545","Name":"Pencil","Name2":"White"}, 
{"category":"ABC","orderID":"34545","Name":"Pen","Name2":"Black"}, 
{"category":"DEF","orderID":"12345","Name":"Pencil","Name2":"Black"}, 
{"category":"DEF","orderID":"12345","Name":"Pen","Name2":"White"}] 
JSON 
,true); 
$result=array(); 
while($row=array_shift($ori))//Pretend that we're fetching record from DB 
{ 
    $result[$row["category"]][$row["orderID"]][]=array("Name"=>$row["Name"],"Name2"=>$row["Name2"]); 
} 
print_r($result); 

Используя сгруппированное значение (category и orderID) как массив ключа, вы делаете поиск и группировку более эффективным. Приведенный выше код печатает:

Array 
(
    [ABC] => Array 
     (
      [12345] => Array 
       (
        [0] => Array 
         (
          [Name] => Pen 
          [Name2] => Black 
         ) 

       ) 

      [34545] => Array 
       (
...... 

Вы все еще получаете те же самые count() результатов, и получает выгоду от нахождения определенной категории и порядка проще: $result[category][order]["Name"]=....

Но если вы настаиваете на том, чтобы нужный формат, вы можете добавить:

array_walk($result,function(&$v,$k){ 
    $x=array("category"=>$k,"children"=>array()); 
    array_walk($v,function($arr,$oid)use(&$x){ 
     $x["children"][]=array("orderID"=>$oid,"children"=>$arr); 
    }); 
    $v=$x; 
}); 
print_r(array_values($result)); 

Этот выход:

Array 
(
    [0] => Array 
     (
      [category] => ABC 
      [children] => Array 
       (
        [0] => Array 
         (
          [orderID] => 12345 
          [children] => Array 
           (
            [0] => Array 
             (
              [Name] => Pen 
              [Name2] => Black 
             ) 

           ) 

         ) 

        [1] => Array 
         (
          [orderID] => 34545 
...... 

Demo. Анонимная функция требует PHP> = 5.3

+0

Я понимаю концепцию. – Sar

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