同事遇到一個一組菜單數據中找到三層菜單名稱一樣的情況下拼接二級菜單的問題.
比如數據是這樣的
最終結果應該是這樣
他採用了好多次循環來解決這個問題,先循環拿到三級菜單的列表形成一個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即可.
輸出效果一樣的