1

SELECT * FROM NavigationMenu ORDER BY parentNavigationMenuId ASC, navigationOrder ASCnav オブジェクトの配列を返すクエリがあります。私が取り組まなければならない結果は次のようになります。

array (
  0 => 
  array (
    'navigationMenuId' => '1',
    'parentNavigationMenuId' => '0',
    'fullURL' => '/index',
    'contentSlug' => 'index',
    'contentAlias' => 'Index',
    'navigationAnchor' => 'Home',
    'navigationOrder' => '1',
    'subNavigationItems' => 
    array (
    ),
  ),
  1 => 
  array (
    'navigationMenuId' => '2',
    'parentNavigationMenuId' => '0',
    'fullURL' => '/top-nav-1/index',
    'contentSlug' => 'index',
    'contentAlias' => 'Index',
    'navigationAnchor' => 'Top Nav 1',
    'navigationOrder' => '2',
    'subNavigationItems' => 
    array (
    ),
  ),
  2 => 
  array (
    'navigationMenuId' => '3',
    'parentNavigationMenuId' => '0',
    'fullURL' => '/top-nav-2/index',
    'contentSlug' => 'index',
    'contentAlias' => 'Index',
    'navigationAnchor' => 'Top Nav 2',
    'navigationOrder' => '3',
    'subNavigationItems' => 
    array (
    ),
  ),
  3 => 
  array (
    'navigationMenuId' => '8',
    'parentNavigationMenuId' => '0',
    'fullURL' => '/top-nav-3/index',
    'contentSlug' => 'index',
    'contentAlias' => 'Top Nav 3',
    'navigationAnchor' => 'Top Nav 3',
    'navigationOrder' => '4',
    'subNavigationItems' => 
    array (
    ),
  ),
  4 => 
  array (
    'navigationMenuId' => '9',
    'parentNavigationMenuId' => '0',
    'fullURL' => '/top-nav-4/index',
    'contentSlug' => 'index',
    'contentAlias' => 'Top Nav 4',
    'navigationAnchor' => 'Top Nav 4',
    'navigationOrder' => '5',
    'subNavigationItems' => 
    array (
    ),
  ),
  5 => 
  array (
    'navigationMenuId' => '13',
    'parentNavigationMenuId' => '0',
    'fullURL' => '/top-nav-5/index',
    'contentSlug' => 'index',
    'contentAlias' => 'Top Nav 5',
    'navigationAnchor' => 'Top Nav 5',
    'navigationOrder' => '6',
    'subNavigationItems' => 
    array (
    ),
  ),
  6 => 
  array (
    'navigationMenuId' => '4',
    'parentNavigationMenuId' => '3',
    'fullURL' => '/top-nav-2/sub-nav-1',
    'contentSlug' => 'sub-nav-1',
    'contentAlias' => 'Sub Nav 1',
    'navigationAnchor' => 'Sub Nav 1',
    'navigationOrder' => '1',
    'subNavigationItems' => 
    array (
    ),
  ),
  7 => 
  array (
    'navigationMenuId' => '5',
    'parentNavigationMenuId' => '3',
    'fullURL' => '/top-nav-2/sub-nav-2',
    'contentSlug' => 'sub-nav-2',
    'contentAlias' => 'Sub Nav 2',
    'navigationAnchor' => 'Sub Nav 2',
    'navigationOrder' => '2',
    'subNavigationItems' => 
    array (
    ),
  ),
  8 => 
  array (
    'navigationMenuId' => '6',
    'parentNavigationMenuId' => '3',
    'fullURL' => '/top-nav-2/sub-nav-3',
    'contentSlug' => 'sub-nav-3',
    'contentAlias' => 'Sub Nav 3',
    'navigationAnchor' => 'Sub Nav 3',
    'navigationOrder' => '3',
    'subNavigationItems' => 
    array (
    ),
  ),
  9 => 
  array (
    'navigationMenuId' => '7',
    'parentNavigationMenuId' => '3',
    'fullURL' => '/top-nav-2/sub-nav-4',
    'contentSlug' => 'sub-nav-4',
    'contentAlias' => 'Sub Nav 4',
    'navigationAnchor' => 'Sub Nav 4',
    'navigationOrder' => '4',
    'subNavigationItems' => 
    array (
    ),
  ),
  10 => 
  array (
    'navigationMenuId' => '10',
    'parentNavigationMenuId' => '9',
    'fullURL' => '/top-nav-4/sub-nav-1',
    'contentSlug' => 'sub-nav-1',
    'contentAlias' => 'Sub Nav 1',
    'navigationAnchor' => 'Sub Nav 1',
    'navigationOrder' => '1',
    'subNavigationItems' => 
    array (
    ),
  ),
  11 => 
  array (
    'navigationMenuId' => '11',
    'parentNavigationMenuId' => '9',
    'fullURL' => '/top-nav-4/sub-nav-2',
    'contentSlug' => 'sub-nav-2',
    'contentAlias' => 'Sub Nav 2',
    'navigationAnchor' => 'Sub Nav 2',
    'navigationOrder' => '2',
    'subNavigationItems' => 
    array (
    ),
  ),
  12 => 
  array (
    'navigationMenuId' => '12',
    'parentNavigationMenuId' => '9',
    'fullURL' => '/top-nav-4/sub-nav-3',
    'contentSlug' => 'sub-nav-3',
    'contentAlias' => 'Sub Nav 3',
    'navigationAnchor' => 'Sub Nav 3',
    'navigationOrder' => '3',
    'subNavigationItems' => 
    array (
    ),
  ),
)

これらのオブジェクトのいずれかが子 nav アイテムを持つことができます (子は他の子を持つことができます)。これが、各 nav アイテムが の空の配列を持つ理由ですsubNavigationItems。私は基本的にプロパティnavigationMenuIdparentNavigationMenuIdプロパティを使用して、正しい親の下にネストされた正しい子を持つjsonオブジェクトを構築したいと考えています。一連のループで実行できると思いますが、そのロジックが頭を悩ませています。これをどのように達成できるかについて誰にも考えがありますか? これは、私が望むもの(または同様のもの)のjsonの例です。

    [
        {
            "navigationMenuId": "1",
            "parentNavigationMenuId": "0",
            "fullURL": "/index",
            "contentSlug": "index",
            "contentAlias": "Index",
            "navigationAnchor": "Home",
            "navigationOrder": "1",
            "subNavigationItems": []
        },
        {
            "navigationMenuId": "2",
            "parentNavigationMenuId": "0",
            "fullURL": "/top-nav-1/index",
            "contentSlug": "index",
            "contentAlias": "Index",
            "navigationAnchor": "Top Nav 1",
            "navigationOrder": "2",
            "subNavigationItems": []
        },
        {
            "navigationMenuId": "3",
            "parentNavigationMenuId": "0",
            "fullURL": "/top-nav-2/index",
            "contentSlug": "index",
            "contentAlias": "Index",
            "navigationAnchor": "Top Nav 2",
            "navigationOrder": "3",
            "subNavigationItems": [
                {
                    "navigationMenuId": "4",
                    "parentNavigationMenuId": "3",
                    "fullURL": "/top-nav-2/sub-nav-1",
                    "contentSlug": "sub-nav-1",
                    "contentAlias": "Sub Nav 1",
                    "navigationAnchor": "Sub Nav 1",
                    "navigationOrder": "1"
                },
                {
                    "navigationMenuId": "5",
                    "parentNavigationMenuId": "3",
                    "fullURL": "/top-nav-2/sub-nav-2",
                    "contentSlug": "sub-nav-2",
                    "contentAlias": "Sub Nav 2",
                    "navigationAnchor": "Sub Nav 2",
                    "navigationOrder": "2"
                },
                {
                    "navigationMenuId": "6",
                    "parentNavigationMenuId": "3",
                    "fullURL": "/top-nav-2/sub-nav-3",
                    "contentSlug": "sub-nav-3",
                    "contentAlias": "Sub Nav 3",
                    "navigationAnchor": "Sub Nav 3",
                    "navigationOrder": "3"
                },
                {
                    "navigationMenuId": "7",
                    "parentNavigationMenuId": "3",
                    "fullURL": "/top-nav-2/sub-nav-4",
                    "contentSlug": "sub-nav-4",
                    "contentAlias": "Sub Nav 4",
                    "navigationAnchor": "Sub Nav 4",
                    "navigationOrder": "4"
                }
            ]
        },
        {
            "navigationMenuId": "8",
            "parentNavigationMenuId": "0",
            "fullURL": "/top-nav-3/index",
            "contentSlug": "index",
            "contentAlias": "Top Nav 3",
            "navigationAnchor": "Top Nav 3",
            "navigationOrder": "4",
            "subNavigationItems": []
        },
        {
            "navigationMenuId": "9",
            "parentNavigationMenuId": "0",
            "fullURL": "/top-nav-4/index",
            "contentSlug": "index",
            "contentAlias": "Top Nav 4",
            "navigationAnchor": "Top Nav 4",
            "navigationOrder": "5",
            "subNavigationItems": [
                {
                    "navigationMenuId": "10",
                    "parentNavigationMenuId": "9",
                    "fullURL": "/top-nav-4/sub-nav-1",
                    "contentSlug": "sub-nav-1",
                    "contentAlias": "Sub Nav 1",
                    "navigationAnchor": "Sub Nav 1",
                    "navigationOrder": "1"
                },
                {
                    "navigationMenuId": "11",
                    "parentNavigationMenuId": "9",
                    "fullURL": "/top-nav-4/sub-nav-2",
                    "contentSlug": "sub-nav-2",
                    "contentAlias": "Sub Nav 2",
                    "navigationAnchor": "Sub Nav 2",
                    "navigationOrder": "2"
                },
                {
                    "navigationMenuId": "12",
                    "parentNavigationMenuId": "9",
                    "fullURL": "/top-nav-4/sub-nav-3",
                    "contentSlug": "sub-nav-3",
                    "contentAlias": "Sub Nav 3",
                    "navigationAnchor": "Sub Nav 3",
                    "navigationOrder": "3"
                }
            ]
        },
        {
            "navigationMenuId": "13",
            "parentNavigationMenuId": "0",
            "fullURL": "/top-nav-5/index",
            "contentSlug": "index",
            "contentAlias": "Top Nav 5",
            "navigationAnchor": "Top Nav 5",
            "navigationOrder": "6",
            "subNavigationItems": []
        }
    ]

私が考えているよりも、これを処理するためのより良い方法を考えることができることをお知らせください. ありがとう!

4

2 に答える 2

0

あなたが望むフォーマットについて何かが欠けているかもしれませんが、なぜ単に使用しないのjson_encodeですか? 正しい出力が生成されませんか?

http://php.net/manual/en/function.json-encode.php

$json = json_encode($input);

ああ、気にしないでください。あなたの出力では、ツリー内で物事を移動する必要があることがわかります。json_encode正しいphp配列を生成した後に使用されます。

于 2013-10-31T21:45:24.853 に答える