Преобразовать массив вложенных родительских / дочерних элементов в нумерованный формат структуры. - PullRequest
0 голосов
/ 25 февраля 2012

Ради возможности поиска и индексации / сортировки массива

У меня есть большой многомерный массив, который я пытаюсь проанализировать.Прямо сейчас я просто использую оболочку CakePHP для этого, но подойдет любой метод.Что мне нужно сделать, это взять массив parent / children / more children и создать массив идентификаторов со связанным «Outline Number»

Так, например:

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 голосов
/ 25 февраля 2012

Я был на правильном пути, я просто добавил дополнительный ненужный шаг.

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. префикс каждого элемента данных в результирующем массиве.

...