php - 数组排序菜单
问题描述
我有以下数组来根据用户指定的顺序显示菜单。
数组如下:
$menuArray = [
'Main Street' => [
['/index.php', 'Home'],
['/city.php', $cityData[$user->city][0]],
['/travel.php', 'Travel'],
['/bank.php', 'Bank'],
['/inventory.php', 'Inventory'],
['/dailies.php', 'Dailies'],
],
'Activities' => [
(!$my->hospital) ? ['/hospital.php', 'Hospital'] : [],
(!$my->hospital && !$my->prison) ? ['/crime.php', 'Crime'] : [],
['/missions.php', 'Missions'],
['/achievements.php', 'Achievements'],
],
'Services' => [
['/hospital.php', 'Hospital'],
['/prison.php', 'Prison'],
['/search.php', 'Search'],
],
'Account' => [
['/edit_account.php', 'Edit Account'],
['/notepad.php', 'Notepad'],
['/logout.php', 'Logout'],
]
];
我有一个menu_order
存储在数据库中的列,其默认值为0,1,2,3,4
,但这可以根据用户进行更改,因为他们可以根据自己的喜好更改菜单。
我想达到的目标:
0 => Main Street
1 => Activities
2 => Services
3 => Account
4 => Communication
为了得到菜单顺序,我做
$menuOrder = explode(',', $user->menu_order);
但我不确定如何处理用于显示菜单的 foreach。
解决方案
这是一种方法——使用替换而不是排序算法。
代码:(演示)
$menuArray = [
'Main Street' => [],
'Activities' => [],
'Services' => [],
'Account' => []
];
$lookup = [
0 => 'Main Street',
1 => 'Activities',
2 => 'Services',
3 => 'Account',
4 => 'Communication'
];
$customsort = '4,2,1,3,0';
$keys = array_flip(explode(',', $customsort)); convert string to keyed array
//var_export($keys);
$ordered_keys = array_flip(array_replace($keys, $lookup)); // apply $lookup values to keys, then invert key-value relationship
//var_export($ordered_keys);
$filtered_keys = array_intersect_key($ordered_keys, $menuArray); // remove items not on the current menu ('Communication" in this case)
//var_export($filtered_keys);
$final = array_replace($filtered_keys, $menuArray); // apply menu data to ordered&filtered keys
var_export($final);
输出:
array (
'Services' =>
array (
),
'Activities' =>
array (
),
'Account' =>
array (
),
'Main Street' =>
array (
),
)
这是另一种使用uksort()
和宇宙飞船运算符的方法:
$ordered_keys = array_flip(array_values(array_replace(array_flip(explode(',', $customsort)), $lookup)));
uksort($menuArray, function($a, $b) use ($ordered_keys) {
return $ordered_keys[$a] <=> $ordered_keys[$b];
});
var_export($menuArray);
由于您存储自定义排序顺序的方式,所涉及的大部分代码仅用于设置“地图”/“查找”数据。
推荐阅读
- azure - 使用 Azure Active Directory 用户时,远程 WMI 查询失败并出现“发生安全包特定错误”
- python - 使用 Plotly Scatter3d 标记太暗
- c# - 如何将自定义类型的列表添加到 userSettings?
- android - 如何在特定时间发送通知
- reactjs - 如何检测单击标题数据表中的复选框
- python - Pandas:将多索引数据框折叠成由逗号分隔的单行和单列
- interaction - 如何计算 SCORM 交互?
- azure-speech - 在 Brwoser 中使用 Azure 语音文本转语音
- android - 从 Playstore 下载内部测试版时,Android 12 beta 5 应用链接不会自动验证
- c++ - 在 QMetaObject::invokeMethod 中使用 QString 时出错