我必须制作一个包含数据库的痕迹菜单。
所以做了这个功能
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 | parentId | title 3 | 1 | keyword 28 | 3 | xxx 31 | 28 | business
我希望像business -> xxx -> keyword
我希望在$row['parentId'] = 1
之前运行此函数。
当我回显标题时,我得到了正确的结果。
当我尝试将其存储在数组中时,我总是得到单值
如何在递归数组中返回数组?
答案 0 :(得分: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;
}
您的问题中很少有不明确的事情:
array_merge
参数的顺序,如果您希望在结果数组中显示子节点之前的父节点。答案 1 :(得分:0)
我真的不喜欢数据库上递归调用的想法。如果这是"面包屑"数据库表,可能有多大? ......我的意思是大小可能不是一个问题。
我想建议您拉出整个表(3列,所有行)并将结果集分配给php变量。这意味着你只需要去一次数据库 - 这是一件好事。
代码:(Demo)
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
答案 2 :(得分:-1)
试试这个:
$result[] = file_list($row['parentId']);
而不是
$result = file_list($row['parentId']);