Конвертировать 2d массив в 3d с PHP - PullRequest
0 голосов
/ 30 сентября 2010

Есть простой 2d массив с каким-то деревом вроде этого:

  • 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',
                              ),
                 ),

    )
 ...
)

Ответы [ 2 ]

1 голос
/ 11 октября 2010

Найдено @ SO Функция обхода PHP для преобразования одного массива во вложенный массив с дочерними элементами - на основе родительского идентификатора

$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 голосов
/ 30 сентября 2010
<?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];.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...