【问题标题】:Json Menu Structure from MySQL来自 MySQL 的 Json 菜单结构
【发布时间】:2012-10-31 10:48:10
【问题描述】:

我一直在纠结这个问题,看起来很简单。我正在尝试使用 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"
    }
  ]
}

问题是我无法事先获得“对” - “title” = “About us”...这很简单,但我对这个问题已经脑残了。

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

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

但是如何在“关于我们”之前显示“key”“titleName”或只是“title”...

【问题讨论】:

  • 显示你尝试了什么
  • 别忘了你可以把它编译成php array 然后用json_encode() 把它转换成json字符串。
  • 请显示你在 json_encode 之后得到了什么输出,比如var_dump(json_encode($menu))

标签: php mysql json


【解决方案1】:
  • 首先我假设您的数据是这样的 -

插入menu
(id, parentmenu, name)
价值观
(1,1,"历史"),
(2,1,"所有者"),
(3,1,"新闻"),
(4,2,"地址"),
(5,2,"地图"),
(6,3,"牛仔裤"),
(7,3,"表格"),
(8,3,"鞋");


INSERT INTO menuHome
(id,titleName)
价值观
(1,"关于我们"),
(2,"联系我们"),
(3,"产品");

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

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


  • 第三,让我们开始编码


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

$arys = ["menu"=>["sections" => [
["title" => "关于我们", "items" => [
["name"=>"历史","id"=>1],
["name"=>"所有者","id"=>2],
["name"=>"新闻","id"=>3]
]],
["title" => "联系我们", "items" => [
["name"=>"地址","id"=>4],
["name"=>"地图","id"=>5]
]],
[“标题”=>“产品”,“项目”=> [
["name"=>"牛仔裤","id"=>6],
["name"=>"表","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;
而($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);

你会得到你想要的输出

【讨论】:

  • 另外,你不需要使用两个表来保存一个父菜单项和另一个子菜单项,因为它们代表相同类型的数据元素,只需像 - 表菜单一样修改你的表(menu_id, parent_menu_id, 标题)
  • 谢谢乔迪,很高兴知道我还有很多东西要学。为什么在只有 40 行工作时使用 20 行。再次感谢,今晚我会睡觉的。
  • 您好,如果您可以将问题标记为已回答并关闭它,那就太好了。而且,我很高兴我能帮上忙 ;)
猜你喜欢
  • 1970-01-01
  • 2010-12-23
  • 1970-01-01
  • 2016-09-09
  • 2019-07-20
  • 2017-04-20
  • 2010-10-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多