如何在数组中循环数组(动态导航)

时间:2015-10-15 08:43:32

标签: php html arrays

我有一些包含一些项目的数组。每个数组都可以有(或没有)子数组,也有一些项目。

如何在循环中调用子数组?很难描述,这里是代码。我知道代码/语法不正确,但语法应该澄清我的问题:

<?php
$subitemsA = array(
    'subA1' => array('num'=>65, 'text'=>'Labor', 'url'=>'#'),
    'subA2' => array('num'=>44, 'text'=>'Rare', 'url'=>'#'),
);

$subitemsB = array(
    'subB1'   => array('num'=>0, 'text'=>'subB1', 'url'=>'#'),
    'subB2'   => array('num'=>0, 'text'=>'subB2', 'url'=>'#'),
    'subB3'   => array('num'=>0, 'text'=>'subB3', 'url'=>'#')
);

$navArray = array(
    'Home'   => array('num'=>0, 'text'=>'Home',  'url'=>'#'),
    'Info'   => array('num'=>0, 'text'=>'Info',  'url'=>'#', 'subArray'=>$subitemsA),
    'Sport'  => array('num'=>0, 'text'=>'Sport', 'url'=>'#', 'subArray'=>$subitemsB),
);


$html = '';
foreach($navArray as $item) {
    $html .= "<li>";
    $html .= "<a href='{$item['url']}'><i class='abc'></i>{$item['text']}</a>\n";

    if (count($navArray) > 3) {

        foreach($navArray.subArray as $subitem) {
            $html .= "<li>";
            $html .= "<a href='{$subitem['url']}'>{$subitem['text']}</a>\n";
            $html .= "</li>";
        }

    }

    $html .= "</li>";
}

第一个foreach循环有效。但是如何访问Info and Sport的subArray?

2 个答案:

答案 0 :(得分:1)

你需要一个三级的foreach才能工作 -

foreach($navArray as $key => $item) {
  $html .= "<li>";
  $html .= "<a href='{$item['url']}'><i class='abc'></i>{$item['text']}</a>\n";
  foreach ($item as $itemkey => $value) {
    if (is_array($value)) { //Now Check if $value is an array
      foreach($value as $valuekey => $subitem) { //Loop through $value
        $html .= "<li>";
        $html .= "<a href='{$subitem['url']}'>{$subitem['text']}</a>\n";
        $html .= "</li>";
      }
    }
  }
  $html .= "</li>";
}

答案 1 :(得分:1)

这是以更一般的方式回答您的问题:如何使用递归和模板处理多级嵌套数组

function parseArray(array $navArray, &$html, $depth = 0) {
  foreach ($navArray as $item) {
    $html .= "<li>";

    // this function use template to create html
    $html .= toHtml($item['url'], $item['text'], $depth);

    foreach ($item as $subItem) {
      if (is_array($subItem)) {
        // use recursion to parse deeper level of subarray
        parseArray($item, $html, $depth + 1);
      }
    }

    $html .= "</li>";

  }
}

function toHtml($url, $text, $depth)
{
  $template = '';
  if ($depth == 0) {
    $template = '<a href=\'{{url}}\'><i class=\'abc\'></i>{{text}}</a>\n';
  } elseif ($depth >= 1) {
    $template = '<a href=\'{{url}}\'>{{text}}</a>\n';
  }
  // define more template for deeper level here if you want

  $template = str_replace('{{url}}', $url, $template);
  $template = str_replace('{{text}}', $text, $template);
  return $template;
}

$html = '';
parseArray($navArray, $html);

只是急切地伪造这个代码,还没有测试它。希望它有所帮助。

此致