Абстрактная функция foreach

nazim спросил: 28 апреля 2018 в 09:38 в: php

Я создал функцию, использующую 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" в примере), извлекая имя меню, именовая массив в соответствии с именем меню, а затем выполняя то, что делают вышеприведенные функции.

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

1 ответ

Есть решение
Gaurav Sharma ответил: 28 апреля 2018 в 09:56

Вы можете выбрать меню следующим образом:

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");