PHP递归问题,数据总是对不上

我有这样一条sql:

SELECT
    *,
IF (
    `pid` > 0,
    concat('0', ',', `pid`, ',', `id`),
    concat(`pid`, ',', `id`)
) new_str
FROM
    `shop`
WHERE
    `deleted_at` IS NULL
AND `type` < 2
AND `status` = 1
ORDER BY
    new_str DESC,
    id DESC

图片描述

但是我使用这样的方式:

SELECT * FROM `shop` WHERE `deleted_at` IS NULL AND `type` < 2 AND `status` = 1 order by id desc

递归的方法如下:

   /**
     * 树状结构
     *
     */
    function getTree($cates, $pid = 0)
    {
        static $tree = [];
        foreach ($cates as $cate) {
            if ($cate['pid'] == $pid) {
                //父类数组赋给$tree数组
                $tree[] = $cate;
               $this->getTree($cates, $cate['id']);
            }
        }
        return $tree;
    }

结果确实少了一条
图片描述

我查询了一下 也没有重复的条数:

SELECT
    *
FROM
    `shop`
WHERE
    `deleted_at` IS NULL
AND `type` < 2
AND `status` = 1
GROUP BY
    `name`
HAVING
    COUNT(*) > 1

我递归错误的地方在哪里呢?

阅读 2.4k
1 个回答

这样也是少一个,此处仅是为了记录

 /**
     * 递归查找父id为$parid的结点
     * @param array $html  按照父-》子的结构存放查找出来的结点
     * @param int $parid  指定的父id
     * @param array $channels  数据数组
     * @param int $dep  遍历的深度,初始化为1
     */
    function getChild(&$html, $parid, $channels)
    {
     //遍历数据,查找parId为参数$parid指定的id
        for ($i = 0; $i < count($channels); $i++) {
            if ($channels[$i]['pid'] == $parid) {
                $html[] = $channels[$i];
                $this->getChild($html, $channels[$i]['id'], $channels);
            }
        }

        return $html;
    }

    $html = [];
    $data = $this->getChild($html,0,$data);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题