5

Bill Karwin がここで示唆しているように、クローズ テーブルにネストされているコメントについて DB にクエリを実行した後、フラット テーブルをツリーに解析する最も効率的でエレガントな方法は何ですか? 、SQL から次のデータ構造を取得します。

"comments": [
            {
                "id": "1",
                "breadcrumbs": "1",
                "body": "Bell pepper melon mung."
            },
            {
                "id": "2",
                "breadcrumbs": "1,2",
                "body": "Pea sprouts green bean."
            },
            {
                "id": "3",
                "breadcrumbs": "1,3",
                "body": "Komatsuna plantain spinach sorrel."
            },
            {
                "id": "4",
                "breadcrumbs": "1,2,4",
                "body": "Rock melon grape parsnip."
            },
            {
                "id": "5",
                "breadcrumbs": "5",
                "body": "Ricebean spring onion grape."
            },
            {
                "id": "6",
                "breadcrumbs": "5,6",
                "body": "Chestnut kohlrabi parsnip daikon."
            }
        ]

PHP を使用してこのデータセットを再構築したいので、コメントは次のようにネストされます。

"comments": [
            {
                "id": "1",
                "breadcrumbs": "1",
                "body": "Bell pepper melon mung."
                "comments": [
                    {
                        "id": "2",
                        "breadcrumbs": "1,2",
                        "body": "Pea sprouts green bean."
                        "comments": [
                            {
                                "id": "4",
                                "breadcrumbs": "1,2,4",
                                "body": "Rock melon grape parsnip."
                            }
                        ]
                    },
                    {
                        "id": "3",
                        "breadcrumbs": "1,3",
                        "body": "Komatsuna plantain spinach sorrel."
                    }
                ]
            },
            {
                "id": "5",
                "breadcrumbs": "5",
                "body": "Ricebean spring onion grape."
                "comments": [
                    {
                        "id": "6",
                        "breadcrumbs": "5,6",
                        "body": "Chestnut kohlrabi parsnip daikon."
                    }
                ]
            }
        ]

ソリューションをハックしましたが、複雑すぎるようです。エレガントで効率的な方法でこれを行うための巧妙なソリューションがあると感じていますが、方法がわかりません。

4

3 に答える 3

1

「id」でインデックス付けされた配列にすべてのデータをフェッチすると仮定します。

while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
        $nodes[$row["id"]] = $row;
}

以下をテストしたところ、必要な JSON 出力が生成されました。

foreach ($nodes as &$node) {
        $parent = array_shift(array_slice(explode(",",$node["breadcrumbs"]), -2, 1));
        if ($parent == $node["id"]) {
                $forest["comments"][] = &$node;
        } else {
                $nodes[$parent]["comments"][] = &$node;
        }
}

print json_encode($forest, JSON_PRETTY_PRINT);
于 2014-11-24T17:30:14.807 に答える
0

2段階のアプローチをお勧めします。ステージ 1: ネストされた配列を構築する ステージ 2: 配列を JSON に変換する

ステージ 1 は、ブレッドクラムに基づいて要素を作成するだけで処理できます。たとえば、「ブレッドクラム」の場合: 「1,2,4」

$comments_array[1][2][4] = $current_element_from_flat_array;

おそらく、ブレッドクラムをその要素に解析し、これに基づく if-else ステートメントを使用することによって、上記のコードに到達するための最もエレガントな方法が何であるかはわかりません。機能するかもしれませんが、おそらく最も洗練されたコードではありません。

$breadcrumbs_list = explode(",", $pizza);
if (count($breadcrumbs_list) == 2)
    $comments_array[$breadcrumbs_list[1]][$breadcrumbs_list[2]] = $current_element_from_flat_array;
else if (count($breadcrumbs_list) == 3)
    $comments_array[$breadcrumbs_list[1]][$breadcrumbs_list[2]][$breadcrumbs_list[1]] = $current_element_from_flat_array;

ステージ 2 は、PHP が提供する json_encode() を使用して実行できます。

于 2013-10-13T21:46:51.107 に答える
0
$tree = array('NULL' => array('children' => array()));
 foreach($array as $item){
    if(isset($tree[$item['id']])){
       $tree[$item['id']] = array_merge($tree[$item['id']],$item);
    } else {
       $tree[$item['id']] = $item;
    }

    $parentid = is_null($item['id_parent']) ? 'NULL' : $item['id_parent'];
    if(!isset($tree[$parentid])) $tree[$parentid] = array('children' => array());
    //this & is where the magic happens: any alteration to $tree[$item['id']
    //  will reflect in the item $tree[$parentid]['children'] as they are the same
    //  variable. For instance, adding a child to $tree[$item['id']]['children]
    //  will be seen in 
    //  $tree[$parentid]['children'][<whatever index $item['id'] has>]['children]
    $tree[$parentid]['children'][] = &$tree[$item['id']];
 }
 $result = $tree['NULL']['children'];
 //always unset references
 unset($tree);

このソリューションには、少し磨きが必要です。それが役に立てば幸い。

于 2014-11-24T02:09:06.907 に答える