首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >php递归函数性能优化

php递归函数性能优化
EN

Stack Overflow用户
提问于 2019-05-12 06:17:29
回答 1查看 439关注 0票数 2

我正在使用Symfony2.8和理论2.4

我有一个实体,具有一对多的、自引用的关联映射entity: id name parent_id 示例:

代码语言:javascript
复制
id: 1 
name: A 
parent_id: null

id: 2
name: B
parent_id = 1

id: 3
name: C
parent_id = 2

id: 4
name: D
parent_id = 3

我编写了一个函数,该函数查找父级的所有嵌套子id。

代码语言:javascript
复制
public function getAllChildrenIdRecursively($entity)
{
    $result = array();
    if (count($entity->getChildren()) > 0) {
        $result[] = $entity->getId();
        foreach ($entity->getChildren() as $child) {
            $result = array_merge($result, $this->getAllChildrenIdRecursively($child)) ;
        }
    }

    return $result;
}

如果我调用这个函数getAllChildrenIdRecursively(2),那么我将得到3,4。

这个函数正在工作,但是我的问题是它在DB中生成了太多的查询,花费了将近1.5秒--.Query生成的查询超过2500,总结果= 2600,总行= 5000

如何减少查询时间?

任何帮助都将不胜感激!谢谢

EN

回答 1

Stack Overflow用户

发布于 2019-05-12 11:25:06

对于您的子实现,您没有有效优化代码的解决方案。您必须更改您的实现,以便只使用一个请求对所有的子级和子级进行检查。树实现是一个更好的解决方案,因为使用一个SQL请求,您可以捕获所有的子级,而另一个则可以捕获所有的父级,等等。

我认为您应该看看这个优秀的树形理论扩展,以避免递归。如果您只在原则2.4中,测试2.3扩展版本。

代码语言:javascript
复制
<?php
namespace Entity;

use Gedmo\Mapping\Annotation as Gedmo;
use Doctrine\ORM\Mapping as ORM;

/**
 * @Gedmo\Tree(type="nested")
 * @ORM\Table(name="categories")
 * use repository for handy tree functions
 * @ORM\Entity(repositoryClass="Gedmo\Tree\Entity\Repository\NestedTreeRepository")
 */
class Category
{
    /**
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue
     */
    private $id;

    /**
     * @ORM\Column(name="title", type="string", length=64)
     */
    private $title;

    /**
     * @Gedmo\TreeLeft
     * @ORM\Column(name="lft", type="integer")
     */
    private $lft;

    /**
     * @Gedmo\TreeLevel
     * @ORM\Column(name="lvl", type="integer")
     */
    private $lvl;

    /**
     * @Gedmo\TreeRight
     * @ORM\Column(name="rgt", type="integer")
     */
    private $rgt;

    /**
     * @Gedmo\TreeRoot
     * @ORM\ManyToOne(targetEntity="Category")
     * @ORM\JoinColumn(name="tree_root", referencedColumnName="id", onDelete="CASCADE")
     */
    private $root;

    /**
     * @Gedmo\TreeParent
     * @ORM\ManyToOne(targetEntity="Category", inversedBy="children")
     * @ORM\JoinColumn(name="parent_id", referencedColumnName="id", onDelete="CASCADE")
     */
    private $parent;

    /**
     * @ORM\OneToMany(targetEntity="Category", mappedBy="parent")
     * @ORM\OrderBy({"lft" = "ASC"})
     */
    private $children;

    public function getId()
    {
        return $this->id;
    }

    public function setTitle($title)
    {
        $this->title = $title;
    }

    public function getTitle()
    {
        return $this->title;
    }

    public function getRoot()
    {
        return $this->root;
    }

    public function setParent(Category $parent = null)
    {
        $this->parent = $parent;
    }

    public function getParent()
    {
        return $this->parent;
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56096663

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档