将嵌套的父/子元素数组转换为大纲编号格式

时间:2012-02-25 09:19:52

标签: php arrays cakephp multidimensional-array tree

为了能够搜索和索引/排序数组

我正在尝试解析一个大型多维数组。现在,我只是使用CakePHP shell这样做,但任何方法都足够了。我需要做的是获取父/子/更多子项的数组,并创建一个带有相关“轮廓号”的id数组

例如:

1
1.1
1.2
1.2.1
1.2.2
1.2.3

等等。

以下是我的“输入数组”的示例:

Array
(
    [0] => Array
        (
            [AsapStructure] => Array
                (
                    [id] => 1
                    [lft] => 30267
                    [rght] => 32774
                    [parent_id] => 
                    [wbs] => 
                )

            [children] => Array
                (
                    [0] => Array
                        (
                            [AsapStructure] => Array
                                (
                                    [id] => 2
                                    [lft] => 30268
                                    [rght] => 30773
                                    [parent_id] => 1
                                    [wbs] => 1
                                )

                            [children] => Array
                                (
                                    [0] => Array
                                        (
                                            [AsapStructure] => Array
                                                (
                                                    [id] => 3
                                                    [lft] => 30269
                                                    [rght] => 30382
                                                    [parent_id] => 2
                                                    [wbs] => 1.1
                                                )

我设想的是拥有一个自我递归的简单解析机制。我开发的一个例子如下:

<?php
    var $structIndex = array();

    private function __parseStruct( $toParse,$prefix = null ) {
        $iterator = 0;
        if ( $prefix )
            $prefix = $prefix . '.';

        foreach( $toParse as $datum ) {
            $iterator++;
            if ( $datum['AsapStructure']['id'] == 1 )
                $this->structIndex[ 1 ] = NULL;
            else            
                $this->structIndex[ $datum['AsapStructure']['id'] ] = $prefix . $iterator  ;

            $subiterator = 0;
            foreach( $datum['children'] as $key => $data ) {
                $subiterator++;
                $this->structIndex[ $data['AsapStructure']['id'] ] = $prefix . $subiterator;
                if ( ! empty( $datum['children'] ) ) {
                    $this->__parseStruct( $datum['children'],  $subiterator );
                }
            }
        }
        return $this->structIndex;
    }

?>

我做的是,我调用此$this->__parseStruct( $data )函数并将数组传递给它。然后该函数遍历数组,调用嵌套子数组的函数。我有一部分工作正常,我似乎无法使逻辑正确创建'索引',即1.1,1.2,1.2.1等等。

那么我的目标输出就是:

$array[ $rowid ] = [ 1.1 / 1.2 / 1.2.1 / 1.2.2 ] or any combination as such.

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

我走在正确的轨道上,我只是添加了一个额外的不必要的步骤。

private function __parseStruct( $toParse,$prefix = null ) {

    $iterator = 0;

    if ( $prefix )
        $prefix = $prefix . '.';

    foreach( $toParse as $datum ) {

        $iterator++;

        if ( $datum['AsapStructure']['id'] == 1 )
            $this->structIndex[ 1 ] = NULL;
        else            
            $this->structIndex[ $datum['AsapStructure']['id'] ] = $prefix . $iterator  ;



        if ( ! empty( $datum['children'] ) ) {

            $this->__parseStruct( $datum['children'],  $prefix.$iterator );

        }



    }

    return $this->structIndex;

}

这解决了这个问题。但是,由于我的数组的性质,我有必要通过执行以下操作来调用该函数:$this->__parseStruct( $data[0]['children'] );否则我最后得到1.为结果数组中的每个数据元素添加前缀。