PHP重新排序数组以反映父/ id层次结构

时间:2010-11-18 16:06:19

标签: php

如何重新排列以下数组

[0] => Array
    (
        [id] => 1
        [parent_id] => 0
        [name] => Accueil
    )

[1] => Array
    (
        [id] => 2
        [parent_id] => 0
        [name] => Exposants
    )

[2] => Array
    (
        [id] => 3
        [parent_id] => 0
        [name] => Visiteurs
    )

[3] => Array
    (
        [id] => 4
        [parent_id] => 0
        [name] => Medias
    )

[4] => Array
    (
        [id] => 5
        [parent_id] => 0
        [name] => Activités
    )

[5] => Array
    (
        [id] => 6
        [parent_id] => 1
        [name] => Contact
    )

[6] => Array
    (
        [id] => 7
        [parent_id] => 3
        [name] => Partenaires
    )

[7] => Array
    (
        [id] => 8
        [parent_id] => 2
        [name] => News
    )

所以我想出了一个反映层次结构的数组,如id和parent_id字段所示?数组键是数组元素的ID字段是父元素。在这个数组中,每次都是一个以ID字段为键的子数组。样品:

[1] => Array
        (
            [name] => Accueil
            [children] => array(
                [0] => bla,
                [3]     => bla2
            )
        )

    [2] => Array
        (
            [name] => Something
            [children] => array(
                [4] => bla3,
            )
        )

2 个答案:

答案 0 :(得分:2)

适用于任何深度并允许孩子在父母之前:

<?php
$p = array(0 => array());
foreach($nodes as $n)
{
  $pid = $n['parent_id'];
  $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]['parent_id']);
  unset($child);

  $p[$pid]['child'][] = &$p[$id];    
}
$nodes = $p['0']['child'];
unset($p);
?>

var_dump结果上使用$nodes查看结构。它接近你的建议。主要区别在于密钥不是ID。

答案 1 :(得分:0)

你可以让它更干,但这是一种快速而肮脏的方式来处理它。此外,如果可以保证每个子记录都有一个有效的父记录,并且有效的父记录在原始数组中的子记录之前,则可以删除6行。

$sorted = array();
foreach( $orig_ary as $item ) {
  if ( $item['parent_id'] === 0 ) {
    if ( !array_key_exists( $item['id'], $sorted ) ) {
      $sorted[ $item['id'] ] = array(
        'name' => '',
        'children' => array()
      );
    }
    $sorted[ $item['id'] ]['name'] = $item['name'];
  } else {
    if ( !array_key_exists( $item['parent_id'], $sorted ) ) {
      $sorted[ $item['parent_id'] ] = array(
        'name' => '',
        'children' => array()
      );
    }
    $sorted[ $item['parent_id'] ]['children'][ $item['id'] ] = $item['name'];
  }
}