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

发布于 2022-09-11 18:55:47 字数 1183 浏览 21 评论 0

我有这样一条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

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

煮酒 2022-09-18 18:55:47

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

 /**
     * 递归查找父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);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文