php sql右边菜单,php-从SQL查询结果构建父/子数组菜单结构

我需要使用MySQL DB查询动态地构建一个复杂的菜单结构.该查询允许定义用户有权使用和查看的菜单项. Menu结构以经典的父/子关系存储到结果集中,其中每个元素都有自己的ID,并依赖于其父ID.父代ID = 0表示该元素上方没有父代(它是根):

MNU_ID MNU_FUNC MNU_PARENT MNU_ICON MNU_TITLE_IT MNU_TITLE_EN

----------------------------------------------------------------------------

1 FLTMGR 0 home STATO FLOTTA FLEET STATUS

2 PSTN 0 map-marker POSIZIONI POSITIONS

3 RTS 0 road PERCORSI ROUTES

4 CHRTS 0 line-charts DIAGRAMMI CHARTS

...

13 MNLS 0 book MANUALI MANUALS

14 RGLTNS 0 bank NORMATIVE REGULATIONS

16 SPD 4 tachometer VELOCITA' SPEED

17 ALT 4 area-chart ALTITUDINE ALTITUDE

18 DST 4 exchange DISTANZA DISTANCE

...

32 INSTL 13 book INSTALLAZIONE SETUP

33 BASE 32 wrench BASE BASE

34 FLPR 32 wrench SONDA CARB. FUAL PROBE

因此,您可以看到元素33和34在元素32下,而元素32在元素13下,最后元素13没有父元素,因为它是根元素(它的MNU_PARENT为0).

好了,我已经开发了我的代码以返回以下内容:

Array(

[FLTMGR] => Array(

[icon] => fa fa-home

[title] => STATO FLOTTA

),

[PSTN] => Array(

[icon] => fa fa-map-marker

[title] => POSIZIONI

),

[RTS] => Array(

[icon] => fa fa-road

[title] => PERCORSI

),

[CHRTS] => Array(

[icon] => fa fa-line-charts

[title] => DIAGRAMMI

[sub] => Array(

[SPD] => Array(

[icon] => fa fa-tachometer

[title] => VELOCITÁ

),

[ALT] => Array(

[icon] => fa fa-area-chart

[title] => ALTITUDINE

),

[DST] => Array(

[icon] => fa fa-exchange

[title] => DISTANZA

),

[GSLN] => Array(

[icon] => fa fa-tint blink

[title] => CARBURANTE

)

)

),

...

[MNLS] => Array(

[icon] => fa fa-book

[title] => MANUALI

[sub] => Array(

[INSTL] => Array(

[MNU_ID] => 32

[MNU_FUNC] => INSTL

[MNU_PARENT] => 13

[icon] => fa fa-book

[title] => INSTALLAZIONE

[sub] => Array(

[0] => Array(

[MNU_ID] => 33

[MNU_FUNC] => BASE

[MNU_PARENT] => 32

[icon] => fa fa-wrench

[title] => BASE

),

[1] => Array(

[MNU_ID] => 34

[MNU_FUNC] => FLPR

[MNU_PARENT] => 32

[icon] => fa fa-wrench

[title] => SONDA CARB.

)

)

)

)

),

[RGLTNS] => Array(

[icon] => fa fa-bank

[title] => NORMATIVE

)

)

但是,如您所见,我无法在fisrt级别上生成正确的结构.换句话说,如果您查看MNLS下的INSTL元素,则会出现以下错误:

>项目MNU_ID,MNU_FUNC,MNU_PARENT不应该存在(请参阅其他项目)

>’sub’下的项目在1中具有相同的错误.

>“ sub”下的项目应使用BASE,FLPR标识,而不是0和1

因此,预期结构应如下所示:

Array(

[FLTMGR] => Array(

[icon] => fa fa-home

[title] => STATO FLOTTA

),

[PSTN] => Array(

[icon] => fa fa-map-marker

[title] => POSIZIONI

[RTS] => Array(

[icon] => fa fa-road

[title] => PERCORSI

),

[CHRTS] => Array(

[icon] => fa fa-line-charts

[title] => DIAGRAMMI

[sub] => Array(

[SPD] => Array(

[icon] => fa fa-tachometer

[title] => VELOCITÁ

),

[ALT] => Array(

[icon] => fa fa-area-chart

[title] => ALTITUDINE

),

[DST] => Array(

[icon] => fa fa-exchange

[title] => DISTANZA

),

[GSLN] => Array(

[icon] => fa fa-tint blink

[title] => CARBURANTE

)

)

),

...

[MNLS] => Array(

[icon] => fa fa-book

[title] => MANUALI

[sub] => Array(

[INSTL] => Array(

[icon] => fa fa-book

[title] => INSTALLAZIONE

[sub] => Array(

[BASE] => Array(

[icon] => fa fa-wrench

[title] => BASE

),

[FLPR] => Array(

[icon] => fa fa-wrench

[title] => SONDA CARB.

)

)

)

)

),

[RGLTNS] => Array(

[icon] => fa fa-bank

[title] => NORMATIVE

)

)

现在的代码:

// $MenuDB contains the Menu structure returned by the DB

// Build the basic structure

$new = array();

foreach ($MenuDB as $a){

$new[$a['MNU_PARENT']][] = $a;

}

// Calls the recursive function CreateTree

$tree = createTree($new, $new[0]);

// Make final correction (remove unwanted items and replace index with keys)

$b=replaceKeys($tree);

print_r($b);

exit();

function replaceKeys(array $input) {

foreach($input as $key => &$val){ // Scan the input array, each element will go in $val, the key will be $key

$input[$val['MNU_FUNC']]=$input[$key]; // Replace index with key, the key is the value of the field MNU_FUNC

if(is_numeric($key)) unset($input[$key]); // Remove the item with numeric key (index) and leave the item with non-numeric index (key)

unset($val['MNU_ID']); // Remove ID

unset($val['MNU_PARENT']); // Remove Parent

unset($val['MNU_FUNC']); // Remove Function

if(isset($val['sub'])) { // avoid to work with undefined items

if (is_array($val['sub'])) { // check if there are childs inside the 'sub' item

$val['sub'] = replaceKeys($val['sub']); // if we have childs, do it again recursively

unset($val['url']); // remove url element if we have childs

unset($val['url_target']); // remove url_target element if we have childs

}

}

}

return $input;

}

function createTree(&$list, $parent){

$tree = array();

foreach ($parent as $k=>$l){

if(isset($list[$l['MNU_ID']])){

$l['sub'] = createTree($list, $list[$l['MNU_ID']]);

}

$tree[] = $l;

}

return $tree;

}

尽管做出了我的努力,我仍然无法弄清错误所在.

我的工作流程有什么改变吗?

解决方法:

您只能使用一个递归函数:

function makeTree($array, $parent) {

$return = [];

foreach ($array as $key => $value) {

if ($value['MNU_PARENT'] == $parent) {

$return[$value['MNU_FUNC']] = [

'icon' => 'fa fa-' . $value['MNU_ICON'],

'title' => $value['MNU_TITLE_IT'],

];

$subs = false;

foreach ($array as $search) {

if ($search['MNU_PARENT'] == $value['MNU_ID']) {

$subs = true;

}

}

if ($subs === true) {

$return[$value['MNU_FUNC']]['subs'] = makeTree($array, $value['MNU_ID']);

}

}

}

return $return;

}

$new = makeTree($arr, 0);

标签:menu,parent-child,arrayofarrays,php,recursion

来源: https://codeday.me/bug/20191110/2013640.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值