使用父/子关系(PHP)重新构造n级数组

时间:2012-03-10 09:12:18

标签: php multidimensional-array

我想重构一个数组,并且有一些关于过度流的解决方案帮助我让它适合于第一级项目,但你会发现数组是n级深度。

方法 restructure()不是递归使用的(它应该是)。这可能完全是错误的,并且不知道如何做对。

children 键表示有相应ID的子项, parent 键将项目链接到父ID。

class FilterMenu {

    protected $tree = array();

    static protected $structure = array();

    public function __construct(array $tree)
    {
        $this->tree = $tree;
    }

    public function getStructure()
    {
        self::restructure($this->tree);
        return self::$structure;
    }

    static public function restructure(array $structure)
    {
        foreach ($structure as $k => $v)
        {
            if (isset($v['parent']) and isset($v['children']) and count($v['children']) == 1)
            {
                // only 1 child
                self::$structure[$k] = current(array_keys($v['children']));
            }
            elseif (isset($v['children']))
            {
                $keys = array_keys($v['children']);
                self::$structure[$k] = array_combine($keys, $keys); // mirror array

                //self::restructure($v['children']);
            }
            else
            {
                // no children
                self::$structure[$k] = $k;
            }
        }
    }
}



// test array

$tree = array(
    1 => array(
        'parent' => 1
    ),
    2 => array(
        'parent' => 2,
        'children' => array(
            3 => array(
                'parent' => 2
            ),
            6 => array(
                'parent' => 2,
                'children' => array(
                    10 => array(
                        'parent' => 6,
                        'children' => array(
                            4 => array(
                                'parent' => 10
                            )
                        )
                    )
                ),
            ),
        ),
    ),
    7 => array(
        'parent' => 7,
        'children' => array(
            11 => array(
                'parent' => 7
            )
        )
    ),
    14 => array(
        'parent' => 14,
        'children' => array(
            15 => array(
                'parent' => 14,
            ),
            16 => array(
                'parent' => 14,
            ),
            19 => array(
                'parent' => 14,
            ),
            20 => array(
                'parent' => 14,
            ),
            21 => array(
                'parent' => 14,
            ),
        )
    )
);

// test:
$tree = new FilterMenu($tree);
echo '<pre>'.print_r($tree->getStructure(), true);

实际结果:

Array
(
    [1] => 1
    [2] => Array
        (
            [3] => 3
            [6] => 6
        )

    [7] => 11
    [14] => Array
        (
            [15] => 15
            [16] => 16
            [19] => 19
            [20] => 20
            [21] => 21
        )

)

期望/预期的结果是:

Array
(
    [1] => 1
    [2] => Array
        (
            [3] => 3
            [6] => Array
                (
                    [10] => 4 // <-- array with n-levels...
                )

        )

    [7] => 11
    [14] => Array
        (
            [15] => 15
            [16] => 16
            [19] => 19
            [20] => 20
            [21] => 21
        )

)

以下是测试类和数组的link to codepad

非常感谢任何帮助。感谢。

1 个答案:

答案 0 :(得分:2)

我认为你正在寻找这个:

function collapse(&$array) {
  foreach ($array as $k => &$v) {
    if (array_key_exists('children', $v)) {
      collapse($v['children']);
      $array[$k] = $v['children'];
    } else {
      $array[$k] = $k;
    }
  }
}

当这样调用时:

collapse($tree);
print_r($tree);

产生

Array (
  [1]  => 1
  [2]  => Array (
            [3] => 3
            [6] => Array (
                     [10] => Array (
                               [4] => 4
                             )
                   )
          )
  [7]  => Array (
            [11] => 11
          )
  [14] => Array (
            [15] => 15
            [16] => 16
            [19] => 19
            [20] => 20
            [21] => 21
         )
)

请参阅http://codepad.org/8atfSWGC