0

我一直在为这个问题转来转去,似乎很简单。我正在尝试使用 PHP/MYSQL 生成菜单/子菜单 json:这些是表:

   CREATE TABLE `menuHome` 
  `id`,
  `titleName`

   CREATE TABLE `menu` 
  `id`,
  `parentmenu`,
  `name`

'menuHome' 将有 'titleName' 例如 'About Us' 通过 'parentmenu' 在 'menu' 上加入 'id' 这将有多个条目,例如 'history'、'Owners'、'News'。

我试图实现的结构是:

`
 {
  "menu" : {
    "sections" : [
      {
        "title" : "About Us",
        "items" : [
          {
            "name" : "History",
            "id" : "0909"
          },
          {
            "name" : "Owners",
            "id" : "0910"
          },
          {
            "name" : "News",
            "id" : "0916"
          }
        ]
      },
      {
        "title" : "Contact Us",
        "items" : [
          {
            "name" : "Address",
            "id" : "0949"
          },
          {
            "name" : "Map",
            "id" : "0978"
          }
        ]
      },
      {
        "title" : "Products",
        "items" : [
          {
            "name" : "Jeans",
            "id" : "1010"
          },
          {
            "name" : "Tables",
            "id" : "1088"
          },
          {
            "name" : "Shoes",
            "id" : "2424"
          }
        ]
      }
    ]
  }
}


`

我已经尝试过,虽然,对于,对于很多配置中的每一个,但我不能让它构建正确的数组结构来编码为 json。我现在处于代码盲区阶段,所以任何帮助都会得到很大的帮助

这是我最后一次尝试:

     $sql_query  = 'SELECT menuHome.titleName, menuHome.id FROM menuHome';
        $result = $mysqli->query($sql_query);
        $menu = array();
        while ($row = $result->fetch_assoc()) {

        $menuid = $row["id"];

        $sql_query2  = 'SELECT menu.name, menu.id FROM menu WHERE menu.parentmenu = "' .  $menuid . '"';

        $result2 = $mysqli->query($sql_query2);

        while ($row2 = $result2->fetch_assoc()) {

         $menu[$row["titleName"]][] = $row2;


         }
        }

return json_encode($menu); 

这是上面带来的结果:

{
  "About Us" : [
    {
      "name" : "History",
      "id" : "1"
    },
    {
      "name" : "Owners",
      "id" : "2"
    },
    {
      "name" : "News",
      "id" : "3"
    }
  ],
  "Contact Us" : [
    {
      "name" : "Address",
      "id" : "4"
    },
    {
      "name" : "Map",
      "id" : "5"
    }
  ],
  "Products" : [
    {
      "name" : "Jeans",
      "id" : "6"
    },
    {
      "name" : "Tables",
      "id" : "7"
    },
    {
      "name" : "Shoes",
      "id" : "8"
    }
  ]
}

问题是我无法事先获得“对”-“标题”=“关于我们”......这很简单,但我对这个问题已经脑死了。

我可以在 json_encode 之前添加这个:

  $menuoutput = array("menu" => array("sections" => array($menu)));

但是如何在“关于我们”之前显示“关键”“标题名称”或仅“标题”...

4

1 回答 1

2
  • 首先我假设你的数据是这样的 -

插入menu
( id, parentmenu, name)

(1,1,"history"),
(2,1,"owners"),
(3,1,"news"),
(4,2,"address"),
(5, 2,"map"),
(6,3,"jeans"),
(7,3,"tables"),
(8,3,"shoes");


INSERT INTO menuHome
( id, titleName)
VALUES
(1,"关于我们"),
(2,"Contact Us"),
(3,"Products");

  • 其次,我建议您将查询更改为-

SELECT pm.id, cm.id, pm.titleName, cm.name FROM menu as cm
LEFT JOIN (menuHome as pm)
ON (pm.id = cm.parentmenu);


  • 第三,让我们开始编码


为了我们的目的,我们想要这样的东西 -

$arys = ["menu"=>["sections" => [
["title" => "关于我们", "items" => [
["name"=>"History","id"=>1] ,
["name"=>"Owners","id"=>2],
["name"=>"News","id"=>3]
]],
["title" => "联系我们", "items" => [
["name"=>"Address","id"=>4],
["name"=>"Map","id"=>5]
]],
["title" => "Products", "items" => [
["name"=>"Jeans","id"=>6],
["name"=>"Tables"," id"=>7],
["name"=>"鞋子","id"=>8]
]]
]
]
];

所以让我们建立它

$querys = "Select pm.id AS pmd , cm.id AS cmd, pm.titleName AS pmt, cm.name AS cmt from menu as cm left join (menuHome as pm) on (pm.id = cm.parentmenu) 订单通过 pmd, cmd ";
$result = mysql_query($querys);
$jsary = ["menu" => ["sections" => []]];
$lastPid = 0;
$currentPid = 0;
$title = "";
$ifff = 0;
$elss = 0;
while($row = mysql_fetch_array($result))
{
        $currentPid = $row['pmd'];
        $title = $row['pmt'];

    $cmd = $row['cmd'];
    $cmt = $row['cmt'];

    if($lastPid != $currentPid)
    {
            $insAry = [];
            $insAry = ["title"=> $title, "items" => [["name" => $cmt, "id" => $cmd]]];
            array_push($jsary["menu"]["sections"], $insAry);
            $lastPid = $currentPid;
            $ifff = $ifff + 1;
            $currentPid = 0;
    }
    else
    {
            $ind = 0;
            if($ifff > 0)
            {
                    $ind = $ifff-1;
            }
            $insAry = [];
            $insAry = ["name" => $cmt, "id" => $cmd];
            array_push($jsary["menu"]["sections"][$ind]["items"], $insAry);
    }}

现在只需调用 json_encode()

json_encode($jsary);

你会得到你想要的输出

于 2012-10-31T12:06:04.913 回答