2

ページのグループを配列に配置し、親ID番号に応じて配置しようとしています。親IDが0の場合、次のような配列として配列に配置したいと思います...

$get_pages = 'DATABASE QUERY'
$sorted = array()

foreach($get_pages as $k => $obj) {
    if(!$obj->parent_id) {
        $sorted[$obj->parent_id] = array();
    }
}

しかし、親IDが設定されている場合は、それを関連する配列に配置したいと思います。これもそのような配列として...

$get_pages = 'DATABASE QUERY'
$sorted = array()

foreach($get_pages as $k => $obj) {
    if(!$obj->parent_id) {
        $sorted[$obj->id] = array();
    } else if($obj->parent_id) {
        $sorted[$obj->parent_id][$obj->id] = array();
    }
}

これは私が問題を抱え始めるところです。配列の2次元に挿入する必要のある3番目の要素がある場合、または3次元に挿入する必要のある4番目の要素がある場合でも、その配列キーが存在するかどうかを確認する方法はありません。したがって、私が理解できないのは、配列キーが1次元の後に存在するかどうか、および存在する場所に存在するかどうかを検出して、新しい要素を配置できるようにする方法です。

これが私のデータベーステーブルの例です

id    page_name    parent_id

1     Products             0
2     Chairs               1
3     Tables               1
4     Green Chairs         2
5     Large Green Chair    4
6     About Us             0

これが私が取得したい出力の例です。これを行うためのより良い方法があれば、私は提案を受け付けています。

Array([1]=>Array([2] => Array([4] => Array([5] => Array())), [3] => Array()), 6 => Array())

よろしくお願いします!

4

1 に答える 1

2

さて、基本的にあなたは木を構築しているので、行く方法の1つは再帰を使うことです:

// This function takes an array for a certain level and inserts all of the 
// child nodes into it (then going to build each child node as a parent for
// its respective children):

function addChildren( &$get_pages, &$parentArr, $parentId = 0 )
{
    foreach ( $get_pages as $page )
    {
        // Is the current node a child of the parent we are currently populating?

        if ( $page->parent_id == $parentId )
        {
            // Is there an array for the current parent?

            if ( !isset( $parentArr[ $page->id ] ) )
            {
                // Nop, create one so the current parent's children can
                // be inserted into it.

                $parentArr[ $page->id ] = array();
            }

            // Call the function from within itself to populate the next level
            // in the array:

            addChildren( $get_pages, $parentArr[ $page->id ], $page->id );
        }
    }
}


$result = array();
addChildren( $get_pages, $result );

print_r($result);

これは最も効率的な方法ではありませんが、ページと階層の数が少ない場合は問題ありません。

于 2012-04-23T10:30:43.943 に答える