多次元の連想配列があります。位置に関係なく、配列から特定のアイテムを削除する方法を見つけようとしています。
この配列は、Webサイトでナビゲーションメニューを作成するために使用されます。サブアイテムは常に、その親アイテム内の「子」と呼ばれる配列にあります。キー「子供」は、子供がいないアイテムには存在しません。
「menuid」はデータベース内のアイテムのIDですが、アイテムには複数のタイプ(ページ、カテゴリページ、ギャラリー、URLなど)があるため、同じ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」の両方に基づいて、配列内のどこからでもアイテムを削除する方法が見つかりませんでした。
配列の例を次に示します。menuid13および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);
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加