如何从 PHP 中的多维关联数组中删除项目
How to remove item from multidimensional, associative array in PHP
我有一个多维关联数组。我正在尝试找到一种方法来从数组中删除特定项目,而不管它们的位置如何。
该数组用于在网站上构建导航菜单。子项将始终位于其父项内称为“children”的数组中。对于没有子项的项,键“children”不存在,如果这样可以使事情变得更容易的话。
"menuid" 是项目在数据库中的 ID,但由于有多种类型的项目(页面、类别页面、画廊、网址等),相同的 menuid 可能会出现多次。我希望能够通过“menuid”和“menutype”删除项目。
我可以单独根据 menuid 删除项目,但只能从根数组中删除:
$key = array_search(15, array_column($array, 'menuid'));
unset($array[$key]);
我更喜欢用函数来做,但我这里也有同样的问题。这也只会删除位于数组根目录中的项目。
function removeItem($array, $menutype, $menuid)
{
foreach ($array as $key => $value)
{
if (is_array($value))
{
if (isset($value['menutype']) && isset($value['menuid']) && $value['menutype'] == $menutype && $value['menuid'] == $menuid)
{
unset($array[$key]);
}
}
}
return $array;
}
$removeItem = removeItem($array, 'simplepage', 11);
我还没有找到一种方法来根据“menutype”和“menuid”从数组中的任何位置删除项目。
这是数组的一个例子。我该怎么做才能删除 menuid 为 13 且 menutype 为“posts_category”的项目?
Array
(
[0] => Array
(
[menutarget] => _parent
[menulink] => /
[rewritename] => Home
[menutype] => url
[menuid] => 2
[id] => Home
)
[1] => Array
(
[id] => Category 3
[menuid] => 15
[menutype] => posts_category
[rewritename] => Category_3
[menulink] =>
[menutarget] => _parent
)
[2] => Array
(
[id] => Page 1
[menuid] => 11
[menutype] => page
[rewritename] => page_1
[menulink] =>
[menutarget] => _parent
[children] => Array
(
[0] => Array
(
[id] => Category 1
[menuid] => 13
[menutype] => posts_category
[rewritename] => Category_1
[menulink] =>
[menutarget] => _parent
[children] => Array
(
[0] => Array
(
[id] => Category 2
[menuid] => 14
[menutype] => posts_category
[rewritename] => Category_2
[menulink] =>
[menutarget] => _parent
)
)
)
)
)
[3] => Array
(
[menutarget] => _parent
[menulink] =>
[rewritename] => Videotest
[menutype] => page
[menuid] => 10
[id] => Videotest
)
)
您想递归检查它:
function removeItem(&$array, $menutype, $menuid)
{
foreach ($array as $key => &$value) {
if (isset($value['menutype'], $value['menuid']) && $value['menutype'] == $menutype && $value['menuid'] == $menuid) {
unset($array[$key]);
} elseif (isset($value['children']) && is_array($value['children'])) {
removeItem($value['children'], $menutype, $menuid);
}
}
}
removeItem($arr, 'posts_category', 13);
print_r($arr);
我有一个多维关联数组。我正在尝试找到一种方法来从数组中删除特定项目,而不管它们的位置如何。
该数组用于在网站上构建导航菜单。子项将始终位于其父项内称为“children”的数组中。对于没有子项的项,键“children”不存在,如果这样可以使事情变得更容易的话。
"menuid" 是项目在数据库中的 ID,但由于有多种类型的项目(页面、类别页面、画廊、网址等),相同的 menuid 可能会出现多次。我希望能够通过“menuid”和“menutype”删除项目。
我可以单独根据 menuid 删除项目,但只能从根数组中删除:
$key = array_search(15, array_column($array, 'menuid'));
unset($array[$key]);
我更喜欢用函数来做,但我这里也有同样的问题。这也只会删除位于数组根目录中的项目。
function removeItem($array, $menutype, $menuid)
{
foreach ($array as $key => $value)
{
if (is_array($value))
{
if (isset($value['menutype']) && isset($value['menuid']) && $value['menutype'] == $menutype && $value['menuid'] == $menuid)
{
unset($array[$key]);
}
}
}
return $array;
}
$removeItem = removeItem($array, 'simplepage', 11);
我还没有找到一种方法来根据“menutype”和“menuid”从数组中的任何位置删除项目。
这是数组的一个例子。我该怎么做才能删除 menuid 为 13 且 menutype 为“posts_category”的项目?
Array
(
[0] => Array
(
[menutarget] => _parent
[menulink] => /
[rewritename] => Home
[menutype] => url
[menuid] => 2
[id] => Home
)
[1] => Array
(
[id] => Category 3
[menuid] => 15
[menutype] => posts_category
[rewritename] => Category_3
[menulink] =>
[menutarget] => _parent
)
[2] => Array
(
[id] => Page 1
[menuid] => 11
[menutype] => page
[rewritename] => page_1
[menulink] =>
[menutarget] => _parent
[children] => Array
(
[0] => Array
(
[id] => Category 1
[menuid] => 13
[menutype] => posts_category
[rewritename] => Category_1
[menulink] =>
[menutarget] => _parent
[children] => Array
(
[0] => Array
(
[id] => Category 2
[menuid] => 14
[menutype] => posts_category
[rewritename] => Category_2
[menulink] =>
[menutarget] => _parent
)
)
)
)
)
[3] => Array
(
[menutarget] => _parent
[menulink] =>
[rewritename] => Videotest
[menutype] => page
[menuid] => 10
[id] => Videotest
)
)
您想递归检查它:
function removeItem(&$array, $menutype, $menuid)
{
foreach ($array as $key => &$value) {
if (isset($value['menutype'], $value['menuid']) && $value['menutype'] == $menutype && $value['menuid'] == $menuid) {
unset($array[$key]);
} elseif (isset($value['children']) && is_array($value['children'])) {
removeItem($value['children'], $menutype, $menuid);
}
}
}
removeItem($arr, 'posts_category', 13);
print_r($arr);