同事遇到一个一组菜单数据中找到三层菜单名称一样的情况下拼接二级菜单的问题.
比如数据是这样的
最终结果应该是这样
他采用了好多次循环来解决这个问题,先循环拿到三级菜单的列表形成一个set集合,然后循环列表判断一下是不是在里面重复了,如果是则拿出来添加二级菜单名称追加到一个新的列表中,否则直接追加到新列表中.
这个实现思路有点过于复杂了.
我这里用PHP快速的验证了一下我的想法
只循环外层数组一次,将L3不断的追加进一个数组,然后判断这个位置是不是出现过重复,如果出现了,将这个索引设定为需要改变标题.
代码如下:
调用如下:
全部代码
<?php
$array = [
['l2' => 'testl2', 'l3' => 'testl3'],
['l2' => 'testl2', 'l3' => 'testl4'],
['l2' => 'testl3', 'l3' => 'testl5'],
['l2' => 'testl4', 'l3' => 'testl6'],
['l2' => 'testl5', 'l3' => 'testl4'],
['l2' => 'testl6', 'l3' => 'testl7'],
['l2' => 'testl7', 'l3' => 'testl8'],
['l2' => 'testl1', 'l3' => 'testl3'],
];
function get_five_item(array $array = [])
{
$set_list = [];
$need_change_key = [];
foreach ($array as $key => $value) {
$array[$key]['need_change'] = false;
$is_in_set = in_array($value['l3'], $set_list) ? array_search($value['l3'], $set_list) : false;
if ($is_in_set !== false) {
$need_change_key[] = $is_in_set;
$need_change_key[] = $key;
} else {
$set_list[$key] = $value['l3'];
}
if ($key == count($array) - 1) {
foreach ($need_change_key as $change_key) {
$array[$change_key]['need_change'] = true;
}
}
}
return $array;
}
$array = get_five_item($array);
foreach ($array as $key => $value) {
if ($value['need_change']) {
echo $value['l2'] . '--'. $value['l3'] . "\r\n";
}else{
echo $value['l3'] . "\r\n";
}
}
-----------------------------------后续更新-------------------------------------------
今天思考了一下,代码完全可以简化这样写
function get_five_item(array $array = [])
{
$hash_list = [];
foreach ($array as $key => $value) {
$array[$key]['need_change'] = false;
if (isset($hash_list[$value['l3']])) {
$first_item_key = $hash_list[$value['l3']];
$array[$first_item_key]['need_change'] = true;
$array[$key]['need_change'] = true;
}else {
$hash_list[$value['l3']] = $key;
}
}
return $array;
}
简单清晰,太方便了,以l3作为key不就知道到底是不是重复了嘛,如果重复,把这个第一次出现的元素和我自己都设定为need_change为true即可.
输出效果一样的