2010-09-30 3 views
0

Есть простой 2d массив с какой-то дерева, как это:Преобразование 2d массив в 3d с PHP

  • node1
    • node2
      • node3

Его структура:

array(
    array (
     'id' : 1, 
     'pid': 0, 
     'title' : 'node1', 
     'level' : 1 
    ), 
    array (
     'id' : 2, 
     'pid': 1, 
     'title' : 'node2', 
     'level' : 2 
    ), 
    array (
     'id' : 3, 
     'pid': 2, 
     'title' : 'node3', 
     'level' : 3 
    ), 
) 

Есть ли решения с PHP, чтобы преобразовать этот массив в:

array(
    array (
     'id' : 1, 
     'title' : 'node1', 
     'child' : array (
        'id' : 2, 
        'title' : 'node2', 
        'child' : array (
           'id' : 3, 
           'title' : 'node3', 
          ), 
       ), 

    ) 
... 
) 
+0

Массив вряд ли идеальная структура для этого. Для чего вы планируете использовать его? – NullUserException

+0

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

+0

У вас всегда есть вход 2d, который вы хотите преобразовать? Есть ли какое-либо правило для преобразования или все они «последовательные», как в вашем примере? – DiogoNeves

ответ

1

Найдено @SO PHP Traversing Function to turn single array into nested array with children - based on parent id

$inArray = array(
    array('ID' => '1', 'parentcat_ID' => '0'), 
    array('ID' => '2', 'parentcat_ID' => '0'), 
    array('ID' => '6', 'parentcat_ID' => '1'), 
    array('ID' => '7', 'parentcat_ID' => '1'), 
    array('ID' => '8', 'parentcat_ID' => '6'),   
    array('ID' => '9', 'parentcat_ID' => '1'), 
    array('ID' => '13', 'parentcat_ID' => '7'), 
    array('ID' => '14', 'parentcat_ID' => '8'),  
); 

function makeParentChildRelations(&$inArray, &$outArray, $currentParentId = 0) { 
    if(!is_array($inArray)) { 
     return; 
    } 

    if(!is_array($outArray)) { 
     return; 
    } 

    foreach($inArray as $key => $tuple) { 
     if($tuple['parentcat_ID'] == $currentParentId) { 
      $tuple['children'] = array(); 
      makeParentChildRelations($inArray, $tuple['children'], $tuple['ID']); 
      $outArray[] = $tuple; 
     } 
    } 
} 

$outArray = array(); 
makeParentChildRelations($inArray, $outArray); 

print_r($outArray); 
0
<?php 
$p = array(0 => array()); 
foreach($nodes as $n) 
{ 
    $pid = $n['pid']; 
    $id = $n['id']; 

    if (!isset($p[$pid])) 
    $p[$pid] = array('child' => array()); 

    if (isset($p[$id])) 
    $child = &$p[$id]['child']; 
    else 
    $child = array(); 

    $p[$id] = $n; 
    $p[$id]['child'] = &$child; 
    unset($p[$id]['pid']); 
    unset($p[$id]['level']); 
    unset($child); 

    $p[$pid]['child'][] = &$p[$id];  
    // $p[$pid]['child'] = &$p[$id]; // or this, if only one child 
} 
$nodes = $p['0']['child']; 
unset($p); 
?> 

Если каждый узел может иметь только одного ребенка, а затем заменить одну строку с $p[$pid]['child'] = &$p[$id];.

(Редактирование:. Установил ее, чтобы работать независимо от того, как узлы сортируются)

+0

Да, я нашел лучшее решение - http: // stackoverflow .com/вопросы/2094207/PHP-функция перемещения к повороту однозначных массива в вложенным-массив с-детьми-ба –

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