从 PHP 中的多维数组中查找特定元素
Find specific element from multidimensional array in PHP
我有一个用于构建导航菜单的多维数组。它可能包含任意数量的子菜单(或 children)。菜单工作得很好。当有人单击菜单 link 时,将打开 ID 为 "menuid" 的产品类别。但是,我还需要知道当前 menuid 的所有 children 的 menuid(但不是 grandchildren 等等)。
这是数组的一个例子:
Array
(
[0] => Array
(
[menutype] => url
[menuid] => 46
)
[1] => Array
(
[menutype] => product_category
[menuid] => 55
[children] => Array
(
[0] => Array
(
[menutype] => product_category
[menuid] => 69
[children] => Array
(
[0] => Array
(
[menutype] => product_category
[menuid] => 211
)
[1] => Array
(
[menutype] => product_category
[menuid] => 57
)
[2] => Array
(
[menutype] => product_category
[menuid] => 166
)
)
)
[1] => Array
(
[menutype] => product_category
[menuid] => 57
)
[2] => Array
(
[menutype] => product_category
[menuid] => 94
)
)
)
[2] => Array
(
[menutype] => posts_category
[menuid] => 45
)
)
例如,我想知道如何获取children中元素的menuid值menuid 为 69 的元素。(应该 return 具有 211、57 和 166 的数组)。
您可以使用这样的递归函数来完成此操作:
function getChildIds($menuItems, $parentId) {
foreach ($menuItems as $menuItem) {
if (isset($menuItem['children'])) {
$result = getChildIds($menuItem['children'], $parentId);
if ($result !== false) {
return $result;
}
}
if ($menuItem['menuid'] == $parentId) {
$result = [];
if (isset($menuItem['children'])) {
foreach ($menuItem['children'] as $childItem) {
$result[] = $childItem['menuid'];
}
}
return $result;
}
}
return false;
}
请注意,如果找到 menuid 但没有子项,这将 return 一个空数组,如果找不到该 id,则返回 false。
您还可以像这样更有效地使用递归函数:
$menu = [
[
'menutype' => 'url',
'menuid' => 46,
],
[
'menutype' => 'product_category',
'menuid' => 55,
'children' => [
[
'menutype' => 'product_category',
'menuid' => 69,
'children' => [
[
'menutype' => 'product_category',
'menuid' => 211
],
[
'menutype' => 'product_category',
'menuid' => 57
],
[
'menutype' => 'product_category',
'menuid' => 166
]
]
],
[
'menutype' => 'product_category',
'menuid' => 57
],
[
'menutype' => 'product_category',
'menuid' => 94
]
]
],
[
'menutype' => 'posts_category',
'menuid' => 45
]
];
function getMenu(array $menu, $menuId, $children = true)
{
foreach ($menu as $menuItem) {
if (array_key_exists('menuid', $menuItem) && $menuItem['menuid'] == $menuId) {
if ($children === true && array_key_exists('children', $menuItem)){
return $menuItem['children'];
}
return $menuItem;
}
if (array_key_exists('children', $menuItem)) {
return getMenu($menuItem['children'], $menuId, $children);
}
}
}
getMenu($menu, 69);
我有一个用于构建导航菜单的多维数组。它可能包含任意数量的子菜单(或 children)。菜单工作得很好。当有人单击菜单 link 时,将打开 ID 为 "menuid" 的产品类别。但是,我还需要知道当前 menuid 的所有 children 的 menuid(但不是 grandchildren 等等)。
这是数组的一个例子:
Array
(
[0] => Array
(
[menutype] => url
[menuid] => 46
)
[1] => Array
(
[menutype] => product_category
[menuid] => 55
[children] => Array
(
[0] => Array
(
[menutype] => product_category
[menuid] => 69
[children] => Array
(
[0] => Array
(
[menutype] => product_category
[menuid] => 211
)
[1] => Array
(
[menutype] => product_category
[menuid] => 57
)
[2] => Array
(
[menutype] => product_category
[menuid] => 166
)
)
)
[1] => Array
(
[menutype] => product_category
[menuid] => 57
)
[2] => Array
(
[menutype] => product_category
[menuid] => 94
)
)
)
[2] => Array
(
[menutype] => posts_category
[menuid] => 45
)
)
例如,我想知道如何获取children中元素的menuid值menuid 为 69 的元素。(应该 return 具有 211、57 和 166 的数组)。
您可以使用这样的递归函数来完成此操作:
function getChildIds($menuItems, $parentId) {
foreach ($menuItems as $menuItem) {
if (isset($menuItem['children'])) {
$result = getChildIds($menuItem['children'], $parentId);
if ($result !== false) {
return $result;
}
}
if ($menuItem['menuid'] == $parentId) {
$result = [];
if (isset($menuItem['children'])) {
foreach ($menuItem['children'] as $childItem) {
$result[] = $childItem['menuid'];
}
}
return $result;
}
}
return false;
}
请注意,如果找到 menuid 但没有子项,这将 return 一个空数组,如果找不到该 id,则返回 false。
您还可以像这样更有效地使用递归函数:
$menu = [
[
'menutype' => 'url',
'menuid' => 46,
],
[
'menutype' => 'product_category',
'menuid' => 55,
'children' => [
[
'menutype' => 'product_category',
'menuid' => 69,
'children' => [
[
'menutype' => 'product_category',
'menuid' => 211
],
[
'menutype' => 'product_category',
'menuid' => 57
],
[
'menutype' => 'product_category',
'menuid' => 166
]
]
],
[
'menutype' => 'product_category',
'menuid' => 57
],
[
'menutype' => 'product_category',
'menuid' => 94
]
]
],
[
'menutype' => 'posts_category',
'menuid' => 45
]
];
function getMenu(array $menu, $menuId, $children = true)
{
foreach ($menu as $menuItem) {
if (array_key_exists('menuid', $menuItem) && $menuItem['menuid'] == $menuId) {
if ($children === true && array_key_exists('children', $menuItem)){
return $menuItem['children'];
}
return $menuItem;
}
if (array_key_exists('children', $menuItem)) {
return getMenu($menuItem['children'], $menuId, $children);
}
}
}
getMenu($menu, 69);