【问题标题】:Creating an array using recursive php from mysql使用 mysql 中的递归 php 创建数组
【发布时间】:2012-06-13 03:27:49
【问题描述】:

我需要从这样组织的 mysql 数据库中创建一个数组

id    description    parentId    
1      Level 1        0           
2      Level 2        0           
3      Level 1a       1   
4      Level 1b       1 
5      Level 1a1      3
6      Level 1a1a     5

所以输出是这样的:

Level 1
      Level 1a
           Level 1a1
                Level 1a1a
      Level 1b
Level 2

但是,我当前的代码仅输出到第二级,然后将其他所有子级设为自己的父级。以下是当前代码:

$query = "SELECT * FROM pB_test ORDER BY parentId ASC";
$result = mysql_query($query) or die ('Database Error (' . mysql_errno() . ') ' . mysql_error());

$tree = array();

while($row = mysql_fetch_assoc($result)) 
{
    if($row['parentId'] == 0) 
    {
        $row['Children'] = array();
        $tree[$row['id']] = array(
                                'id' => $row['id'], 
                                'description' => $row['description'], 
                                'parentId' => $row['parentId']
                            );
    } 
    else 
    {
        $tree[$row['parentId']]['Children'][$row['id']] = $row['description'];
    }
}

$count = array_keys($tree);

foreach ($count as $array)
{
    ksort($tree[$array]['Children']);
}

echo print_r($tree, true);

任何朝着正确方向的帮助或推动都会很棒。干杯

更新:工作代码

    $results = array();
while($row=mysql_fetch_assoc($dbresult)) 
{ 
    $results[]=$row;

    $tree = null;
foreach($results as $result)
{
    $thisref = &$refs->{$result['id']};
    foreach($result as $k => $v)
    {
        $thisref->{$k} = $v;
    }
    if ($result['parentId'] == 0) {
        $tree->{$result['id']} = &$thisref;
    } else {
        $refs->{$result['parentId']}->children->{$result['id']} = &$thisref;
    }
}

$tree; // contains the newly sorted tree.

}

print_r($tree);

【问题讨论】:

  • 已添加。抱歉让您耽搁了。

标签: php mysql arrays recursion


【解决方案1】:

我发现这段用于对父子数组进行分组的代码非常棒。我已经在 4 个深度进行了测试,没有任何问题。但它不是递归函数。

$tree = null;
foreach($results as $result)
{
    $thisref = &$refs->{$result['id']};
    foreach($result as $k => $v)
    {
        $thisref->{$k} = $v;
    }
    if ($result['parentId'] == 0) {
        $tree->{$result['id']} = &$thisref;
    } else {
        $refs->{$result['parentId']}->children->{$result['id']} = &$thisref;
    }
}

$tree; // contains the newly sorted tree.

您可能需要对其进行一些修改才能完全适应您的情况。但基本上它会遍历所有结果并通过引用组合它们。

请注意结尾$tree 数据类型是object 而不是array

祝你好运

更新

你可以这样创建数组

$query = "SELECT * FROM pB_test ORDER BY parentId ASC";
$dbresult = mysql_query($query) or die ('Database Error (' . mysql_errno() . ') ' . mysql_error());

$results = array();
while($row=mysql_fetch_assoc($dbresult)) 
{ 
    $results[]=$row 
}

【讨论】:

  • 我在这里听起来完全是白痴,但我如何将 mysql 加载到这里。数组和 foreach() 不是我的东西,我的大脑现在完全融化了。
  • 非常感谢,感谢您的帮助!
  • 由于某种原因我收到此错误,有什么线索可以说明它可能是什么吗? object(stdClass)#18 (1) { ["C"]=> &NULL }
  • 我根本没有收到错误报告,只是屏幕上出现了上面的 sn-p。我将在问题上发布我的更新代码以供参考
  • @KeiranLovett 尝试将我的更新代码放在我最初发布的代码之上。而不是将它们组合起来
【解决方案2】:

如果您在创建对象时创建了一个从 id 映射到对象的数组,那么这可能是最简单的,这样您就可以轻松地查找嵌套对象。基本上:

$tree = array();
$lookup = array();

while($row = mysql_fetch_assoc($result))  
{
    $object = array('id' => $row['id'],        
                    'description' => $row['description'],        
                    'parentId' => $row['parentId']);

    $lookup[$row['id']] = $object;

    $parentId = $row['parentId'];
    if ($parentId == 0)
    {
        $tree[] = $object;
    }
    else
    {
        $lookup[$parentId]['Children'][] = $object;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-05
    • 2012-06-15
    • 2021-04-23
    • 2010-12-08
    • 2017-02-13
    • 2021-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多