PHP多维数组到无序列表,构建url路径

时间:2021-11-21 21:33:04

I have a multidimensional array in PHP produced by the great examples of icio and ftrotter (I am use ftrotterrs array in arrays variant):

我在PHP中有一个多维数组,由icio和ftrotter的优秀例子生成(我在数组变体中使用ftrotterrs数组):

Turn database result into array

将数据库结果转换为数组

I have made this into a unordered list width this method:

我把它变成了无序列表宽度这个方法:

public function outputCategories($categories, $startingLevel = 0)
{
  echo "<ul>\n";
  foreach ($categories as $key => $category)
  {
    if (count($category['children']) > 0)
    {
      echo "<li>{$category['menu_nl']}\n";
      $this->outputCategories($category['children'], $link
                              , $start, $startingLevel+1);
      echo "</li>\n";
    }
    else
    {
      echo "<li>{$category['menu_nl']}</li>\n";
    }
  }
  echo "</ul>\n";
}

So far so good.

到现在为止还挺好。

Now I want to use the url_nl field to build up the url's used as links in the menu. The url has to reflect the dept of the link in de tree by adding up /url_nl for every step it go's down in the tree.

现在我想使用url_nl字段来构建用作菜单中链接的url。 url必须通过为树中的每个步骤添加/ url_nl来反映de tree中链接的部分。

My goal:

- item 1 (has link: /item_1)
    * subitem 1 (has link: /item_1/subitem_1)
    * subitem 2 (has link: /item_1/subitem_1)
        * subsubitem 1 (has link: /item_1/subitem_2/subsubitem_1)
- item 2 (has link: /item_2)

the table

id
id1 (parent id)
menu_nl
url_nl
title_nl
etc

What I have so far:

到目前为止我所拥有的:

public function outputCategories($categories, $link, $start, $startingLevel = 0)
{
  // if start not exists
  if(!$start)
    $start = $startingLevel;

  echo "<ul>\n";
  foreach ($categories as $key => $category)
  {
    $link.= "/".$category['url_nl'];

    if($start != $startingLevel)
      $link = strrchr($link, '/');

    if (count($category['children']) > 0)
    {
      echo "<li>".$start." - ".$startingLevel.
           "<a href='$link'>{$category['menu_nl']}</a> ($link)\n";
      $this->outputCategories($category['children'], $link
                              , $start, $startingLevel+1);
      echo "</li>\n";
    }
    else
    {
      $start = $startingLevel+1;
      echo "<li>".$start." - ".$startingLevel.
           "<a href='$link'>{$category['menu_nl']}</a> ($link)</li>\n";
    }
  }
  echo "</ul>\n";
}

As you see in the example I have used a url_nl field which is recursively added so every level of the list has a link with a path which is used as a url.

正如您在示例中看到的,我使用了一个url_nl字段,该字段以递归方式添加,因此列表的每个级别都有一个链接,其中包含用作url的路径。

Anyhow, I have problems with building up these links, as they are not properly reset while looping to the hierarchical list. After going down to the child in de list the first one is right but the second one not.

无论如何,我在构建这些链接时遇到问题,因为它们在循环到分层列表时没有正确重置。在列表中的孩子之后,第一个是正确的,但第二个没有。

I'm stuck here...

我被困在这里......

2 个解决方案

#1


1  

It looks like you modify the $link variable inside the foreach loop, So you add item1 to $link, loop thru its subitems and return to the first iteration and add item2 to the variable...

看起来你修改了foreach循环中的$ link变量,所以你将item1添加到$ link,循环它的子项并返回第一次迭代并将item2添加到变量中......

replace this

$link   .= "/".$category['url_nl']; 

with

$insidelink   = $link . "/".$category['url_nl']; 

(and change remaining $link inside the loop to $insidelink)

(并将循环内剩余的$ link更改为$ insidelink)

Adding: This is also true for $startingLevel. Do not modify it, use +1 inline:

添加:对于$ startingLevel也是如此。不要修改它,使用+1 inline:

echo "<li>".$start." - ".$startingLevel +1.
    "<a href='$link'>{$category['menu_nl']}</a> ($link)</li>\n";

#2


1  

Here is an easier way:

$inarray = your multi-dimensional array here. I used directory_map in codeigniter to get contents of directory including it's subdirectories.

$ inarray =你的多维数组。我在codeigniter中使用了directory_map来获取目录的内容,包括它的子目录。

$this->getList($filelist2, $filelist);
foreach ($filelist as $key => $val) {
    echo $val;
}

function getList($inarray, &$filelist, $prefix='') {
    foreach ($inarray as $inkey => $inval) {
        if (is_array($inval)) {
            $filelist = $this->getList($inval, $filelist, $inkey);
        } else {
            if ($prefix)
                $filelist[] = $prefix . '--' . $inval;
            else
                $filelist[] = $inval;
        }
    }

    return $filelist;
}

#1


1  

It looks like you modify the $link variable inside the foreach loop, So you add item1 to $link, loop thru its subitems and return to the first iteration and add item2 to the variable...

看起来你修改了foreach循环中的$ link变量,所以你将item1添加到$ link,循环它的子项并返回第一次迭代并将item2添加到变量中......

replace this

$link   .= "/".$category['url_nl']; 

with

$insidelink   = $link . "/".$category['url_nl']; 

(and change remaining $link inside the loop to $insidelink)

(并将循环内剩余的$ link更改为$ insidelink)

Adding: This is also true for $startingLevel. Do not modify it, use +1 inline:

添加:对于$ startingLevel也是如此。不要修改它,使用+1 inline:

echo "<li>".$start." - ".$startingLevel +1.
    "<a href='$link'>{$category['menu_nl']}</a> ($link)</li>\n";

#2


1  

Here is an easier way:

$inarray = your multi-dimensional array here. I used directory_map in codeigniter to get contents of directory including it's subdirectories.

$ inarray =你的多维数组。我在codeigniter中使用了directory_map来获取目录的内容,包括它的子目录。

$this->getList($filelist2, $filelist);
foreach ($filelist as $key => $val) {
    echo $val;
}

function getList($inarray, &$filelist, $prefix='') {
    foreach ($inarray as $inkey => $inval) {
        if (is_array($inval)) {
            $filelist = $this->getList($inval, $filelist, $inkey);
        } else {
            if ($prefix)
                $filelist[] = $prefix . '--' . $inval;
            else
                $filelist[] = $inval;
        }
    }

    return $filelist;
}