0

我必须制作一个带有数据库的面包屑菜单。

所以做了这个功能

function file_list($path) {
    $result = array();
    $q = "SELECT staticTitle,staticId,parentId FROM tbl_static_pages WHERE staticId = $path";
    $run = mysql_query($q);
    while($row = mysql_fetch_array($run)) {
        if($row['parentId'] > 1) {
            echo $row['staticTitle'];
            $result = file_list($row['parentId']);
            return $result; // INSERTED
        }else { 
            return $result; 
        }  
    }

我有一个这样的数据库结构:

编号 | 父ID | 标题
 3 | 1 | 关键词
 28 | 3 | xxx
 31 | 28 | 商业

我想这样输出business -> xxx -> keyword

我想运行这个函数直到$row['parentId'] = 1.
当我呼应标题时,我得到了正确的结果。
当我尝试将其存储在数组中时,我总是得到单个值。

如何在递归数组中返回一个数组?

4

3 回答 3

1

我真的不喜欢对数据库进行递归调用的想法。如果这是一个“面包屑”数据库表,它可能有多大?...我的意思是尺寸可能不是问题。

我想建议您拉出整个表格(3 列,所有行)并将结果集分配给 php 变量。这意味着您只需要访问一次数据库——这是一件好事。

代码:(演示

function breadcrumber($array,$id){
    static $result=[];  // declare the storage variable without losing elements during recursion
    if(isset($array[$id])){  // if target exists
        $result[]=$array[$id]['title'];  // store title text
        $parent=$array[$id]['parentId'];  // assign new target
        unset($array[$id]);  // remove possibility of an infinite loop
        breadcrumber($array,$parent);  // recurse
    }
    return $result;
}

$resultset=[
    ['id'=>3,'parentId'=>1,'title'=>'keyword'],
    ['id'=>28,'parentId'=>3,'title'=>'xxx'],
    ['id'=>31,'parentId'=>28,'title'=>'business']
];

echo implode(' -> ',breadcrumber(array_column($resultset,NULL,'id'),31));
//                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-assign associative keys for easy lookup

输出:

business -> xxx -> keyword

...这是另一个使用您的第二组数据的演示

于 2018-02-03T13:48:53.903 回答
0

尝试这个:

function file_list($path)
{
    $result = array();
    $q = "SELECT staticTitle,staticId,parentId FROM tbl_static_pages WHERE staticId = $path";
    $run = mysql_query($q);

    $results = array();
    while ($row = mysql_fetch_array($run))
    {
        if ($row['parentId'] > 1)
        {
            echo $row['staticTitle'];
            $results = array_merge($results, file_list($row['parentId']));
        }
        else
        { 
            $results[] = $result; 
        }
    }  
    return $results;
}

您的问题中尚不清楚的几件事:

  • 面包屑通常不是递归的,所以我想你不想实际返回一个递归数组(每个元素都是数组的数组)。如果您愿意,请关注@midhunjose 的评论
  • 您是否希望查询返回多条记录?
  • array_merge如果您希望结果数组中的父级在子级之前,请交换参数的顺序。
于 2013-04-15T08:36:39.253 回答
-1

尝试这个:

$result[] = file_list($row['parentId']);

例如

$result = file_list($row['parentId']);
于 2013-04-15T07:04:59.043 回答