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


How to loop an array in array (dynamic navigation)

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

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

<?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和Sport的子数组呢?

你需要一个三级的每一个工作-

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

这是你的问题在更一般的方式的答案:如何处理多层次嵌套数组使用递归和模板

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

赶紧把这段代码忘了,还没测试呢。希望能有所帮助。

认为,