Абстрагирование функции foreach

Я создал функцию, использующую foreach для хранения данных в массивах (в данном случае это пункты меню WordPress):

public function beratungmenu()
{
$array_menu = wp_get_nav_menu_items("205");
$beratungmenu = array();
foreach ($array_menu as $m) {
if (empty($m->menu_item_parent)) {
$beratungmenu[$m->ID] = array();
$beratungmenu[$m->ID]['ID']          =   $m->ID;
$beratungmenu[$m->ID]['title']       =   $m->title;
$beratungmenu[$m->ID]['url']         =   $m->url;
$beratungmenu[$m->ID]['postid']      =   get_post_meta( $m->ID, '_menu_item_object_id', true );
$beratungmenu[$m->ID]['desc']        =   get_field('menu_item_desc', $m);
$beratungmenu[$m->ID]['icon']        =   get_field('fa_icon_name', get_post_meta( $m->ID, '_menu_item_object_id', true ));
}
}
$this_menu = wp_get_nav_menu_object("205");
$beratungmenu['menu_title'] = $this_menu->name;

return $beratungmenu;
}

public function institutmenu()
{
$array_menu = wp_get_nav_menu_items("206");
$institutmenu = array();
foreach ($array_menu as $m) {
if (empty($m->menu_item_parent)) {
$institutmenu[$m->ID] = array();
$institutmenu[$m->ID]['ID']          =   $m->ID;
$institutmenu[$m->ID]['title']       =   $m->title;
$institutmenu[$m->ID]['url']         =   $m->url;
$institutmenu[$m->ID]['postid']      =   get_post_meta( $m->ID, '_menu_item_object_id', true );
$institutmenu[$m->ID]['icon']        =   get_field('fa_icon_name_institut', get_post_meta( $m->ID, '_menu_item_object_id', true ));
}
}
$this_menu = wp_get_nav_menu_object("206");
$institutmenu['menu_title'] = $this_menu->name;

return $institutmenu;
}

Чтобы сделать это здесь, я должен создать отдельную функцию для каждого меню, что не очень элегантно, так как функции выполняют одно и то же, просто с другим именем массива.

В целях обучения я пытаюсь найти способ абстрагировать эту идею еще на один уровень, чтобы иметь возможность иметь только одну функцию, выполняющую одно и то же, передавая идентификатор меню («205» и «206» в примере), извлекая название меню, присвоение имени массиву в соответствии с именем меню, а затем выполнение действий, указанных выше.

Как это было бы возможно?

0

Решение

Вы можете получить меню, как это:

public function getMenu($menuId, $fieldName)
{
$array_menu = wp_get_nav_menu_items($menuId);
$menu = array();
foreach ($array_menu as $m) {
if (empty($m->menu_item_parent)) {
$menu[$m->ID] = array();
$menu[$m->ID]['ID']          =   $m->ID;
$menu[$m->ID]['title']       =   $m->title;
$menu[$m->ID]['url']         =   $m->url;
$menu[$m->ID]['postid']      =   get_post_meta( $m->ID, '_menu_item_object_id', true );
$menu[$m->ID]['icon']        =   get_field($fieldName, get_post_meta( $m->ID, '_menu_item_object_id', true ));
}
}
$this_menu = wp_get_nav_menu_object($menuId);
$menu['menu_title'] = $this_menu->name;

return $menu;
}

$beratungmenu = getMenu("205", "fa_icon_name");
$institutmenu = getMenu("206", "fa_icon_name_institut");
0

Другие решения

Других решений пока нет …