2015-06-26 5 views
2

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

это массив, который я в настоящее время есть (значения в этих массивах просто пример)

array:4[ 
    1=> array:2 [ 
    2 =>2 
    4 => 4 
    ] 
    2=> array:1[ 
    3=>3 
    ] 
    3=> array:1[ 
    5=>5 
    ] 
    9=> array:1[ 
    6=>6 
    ] 
] 

теперь я хочу этот

array:4[ 
    1=> array:2 [ 
    2 => array:1 [ 
     3=> array:1 [ 
     5=>5 
     ] 
    ] 
    4 => 4 
    ] 
    9=> array:1[ 
    6=>6 
    ] 
] 

как преобразовать первый второй время сохраняя ключи массива, я хочу использовать клавиши для вызова другого массива со всеми соответствующими объектами и данными , поэтому я могу получить это как результат: http://www.bootply.com/dFeKoQmgb2

+0

Если первый массив будет содержать ключ «5», выходной массив должен быть на один уровень глубже, правильно ли? Если это так, вам нужно выполнить поиск по рекурсии. :-) – Blaatpraat

+0

ну не совсем, цифры имеют значение только для структуры, эти цифры никогда не будут одинаковыми. ключ массива - parent_id, а значение - список дочерних элементов, я хочу объединить всех родителей и детей с одинаковым идентификатором – aranna

ответ

0

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

$array = array(
    1 => array(
     2 => 2, 
     4 => 4 
    ), 
    2 => array(
     3 => 3 
    ), 
    3 => array(
     5 => 5 
    ), 
    9 => array(
     6 => 6 
    ) 
); 

//we need the copy to delete there nodes that have been re-atached. Otherwise, we end up changing the array itself within recursion, which is not good 
$arrayCopy = $array; 

function recursive(&$array, &$arrayCopy) { 
    foreach($array as $key => &$value) { 
     //if we found the leaf node 
     if(!is_array($value)) { 
      // and there is something in the array copy with this index 
      if(array_key_exists($key, $arrayCopy)) { 
       // re-attach it to the initial array. $value is passed by reference. BTW, not a good approach as I stated above, but it works on the sample data 
       $value = $arrayCopy[$key]; 
       // remove that node from array copy in order to not double process it. 
       unset($arrayCopy[$key]); 
       // call it again for the leaf-node value 
       recursive($value, $arrayCopy); 
      } 
      // here is recursion exit, if we don't find anything in the arracy copy for the fiven leaf node 
     } else { 
      //recursive call it for the node 
      recursive($value, $arrayCopy); 
     } 
    } 
} 
// launch the recursion 
recursive($array, $arrayCopy); 

// now we need to remove the nodes that have been removed from the array copy, i.e. the ones being re-attached. We could not do this in the recursion 
$result = array(); 
foreach(array_keys($arrayCopy) as $initial_key) { 
    $result[$initial_key] = $array[$initial_key]; 
} 

var_dump($result); 
0

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

array (size=5) 
    0 => 
    array (size=3) 
     'id' => int 2 
     'parent' => int 1 
     'name' => string 'voluptatem' (length=10) 
    1 => 
    array (size=3) 
     'id' => int 3 
     'parent' => int 2 
     'name' => string 'qui' (length=3) 
    2 => 
    array (size=3) 
     'id' => int 4 
     'parent' => int 1 
     'name' => string 'qui' (length=3) 
    3 => 
    array (size=3) 
     'id' => int 5 
     'parent' => int 3 
     'name' => string 'voluptate' (length=9) 
    4 => 
    array (size=3) 
     'id' => int 6 
     'parent' => int 9 
     'name' => string 'optio' (length=5) 


private function generatePageTree($datas, $parent=0, $limit=0) 
    { 
     if ($limit > 100) return ''; 
     $tree='<ul class="list-group">'; 
     foreach ($datas as $data) { 
      if ($data['parent'] == $parent) { 
       $tree.='<div class="panel-group" id="accordion" role="tablist" aria-multiselectable="false"> 
          <div class="panel panel-default"> 
           <div class="panel-heading" role="tab" id="heading' . $data['id'] . '"> 
            <h4 class="panel-title" style="height:50px;"> 
             <a class="collapsed" role="button" data-toggle="collapse" data-parent="accordion" href="#collapse' . $data['id'] . '" aria-expanded="false" aria-controls="collapse' . $data['id'] . '"> 
              ' . $data['name'] . ' 
             </a> 
             <a href="' . action('[email protected]', $data['id']) . '" class="btn btn-default navbar-right"><i class="fa fa-search"></i>Toon</a> 
            </h4> 
           </div> 
           <div id="collapse' . $data['id'] . '" class="panel-collapse collapse out" role="tabpanel" aria-labelledby="heading' . $data['id'] . '"> 
            <div class="panel-body">'; 
       $tree.=$this->generatePageTree($datas, $data['id'], $limit ++); 
       $tree.='</div> 
           </div> 
          </div> 
          </div> 
         '; 
      } 
     } 
     $tree.='</ul>'; 

     return $tree; 
    } 
Смежные вопросы