在foreach()循环中检索数组值

时间:2016-09-08 21:41:29

标签: php wordpress

我正在尝试输出Wordpress'导航菜单项及其CSS类。

我能够获得菜单项,但是类更复杂。 css类有一个数组,但它已经在foreach()循环中。

$menu_items = wp_get_nav_menu_items($menu->term_id);

$menu_list = '<ul id="menu-' . $menu_name . '">';

foreach ( (array) $menu_items as $key => $menu_item ) {
    $title = $menu_item->title;
    $url = $menu_item->url;
    $classes = $menu_item->classes;

    $menu_list .= '<li>';
    $menu_list .= '<i class=""></i>';
    $menu_list .= '<a href="' . $url . '">' . $title . '</a>';
    $menu_list .= '</li>';
}

$menu_list .= '</ul>';

正如您所看到的,在foreach()循环中,我得到$title$url两个字符串。但是当我尝试通过$menu_item->classes获取与菜单项关联的css类时,它返回一个数组,我不知道该怎么做。

因为每个菜单项都有3个css类fa fa-user fa-3x,所以我可以使用此

返回值
$classes[0] . $classes[1] . $classes[2]

但是假设我不想要第三堂课而且我把它留空了,我得到了一个丢失的偏移错误。

我也试过在原始的foreach中做一个foreach

$menu_list .= '<li>';
foreach($classes as $class) {
    $menu_list .= '<i class="'. $class .'"></i>';
}
$menu_list .= '<a href="' . $url . '">' . $title . '</a>';
$menu_list .= '</li>';

但是这会为每个菜单项返回3个单独的<i>标签,这不是我想要的。输出看起来像这样

<i class="fa"></i>
<i class="fa-user"></i>
<i class="fa-3x"></i>

2 个答案:

答案 0 :(得分:1)

只需使用嵌套循环,就像这样:

<?php

    $menu_items = wp_get_nav_menu_items($menu->term_id);

    $menu_list  = '<ul id="menu-' . $menu_name . '">';

    foreach ( (array) $menu_items as $key => $menu_item ) {
        $title      = $menu_item->title;
        $url        = $menu_item->url;
        $classes    = $menu_item->classes;
        $comboClass = "";

        // USING NESTED LOOP CONSTRUCT
        foreach($classes as $class){
            $comboClass .= $class . " "; // SEPARATE CLASS-NAME WITH A SPACE
        }

        $menu_list .= '<li>';
        $menu_list .= '<i class="' .$comboClass . '"></i>';
        $menu_list .= '<a href="' . $url . '">' . $title . '</a>';
        $menu_list .= '</li>';
    }

    $menu_list .= '</ul>';

答案 1 :(得分:-1)

你可以嵌套循环......

foreach(...) {
   ... html stuff ..
   echo '<div class="';
   foreach($classes as $class) {
     echo $class, ' ';
   }
   echo '">...</div>';
}