使用php获取所有等效产品的递归函数

时间:2017-08-14 11:04:32

标签: php doctrine-orm symfony-3.3

我正在使用symfony 3,我有一个表与多对多关系自我引用。 海贼王有许多等同物件。 一件相同的作品与许多作品有关。

例如:

件:件1 |第2篇|第3篇

等价物:第4篇|第1篇|第4部分                                              第5篇

我想获得第1部分的所有等价物,结果必须是:第4部分,第2部分,第3部分,第5部分

这是我尝试的代码,它只给出:第4部分,第3部分

 public function findAllEquivalentsByReference($reference)
{
    $pieceFinales = array();
    $listFinal = array();

    $pieceO =  $this->getEntityManager()
        ->createQuery(
             'SELECT p FROM EKPlateformeBundle:Piece p '.
             'where  p.reference = :ref   and  p.etat = true ')
        ->setParameter('ref',$reference)
        ->getResult();

    if (empty($pieceO))
    {
          $pieceO =  $this->getEntityManager()
        ->createQuery(
             'SELECT p FROM EKPlateformeBundle:Piece p '.
             'INNER JOIN p.references_oem  r '.
             'where (( r.reference = :ref ) OR ( p.reference = :ref  ) ) and 
             ( p.etat = true )')
        ->setParameter('ref',$reference)
        ->getResult();
    }


     foreach ($pieceO as $piece) 
     {      
            $equivalents = $piece->getEquivalents();
            $initiaux = $piece->getPieceInitiale(); 

            // Les equivalents : 
            foreach ($equivalents as $pe)
            {   
                    $autreEquivalents = $pe->getEquivalents();
                    array_push($listFinal, $pe); 
                    foreach ($autreEquivalents as $p)
                    {  
                        if (!in_array($p, $listFinal))
                        {
                            array_push($listFinal, $p);
                            $piece->addEquivalent($p);
                        }
                    }
            }

            //
            foreach ($initiaux as $i)
            {   
                $autreInitiaux = $i->getPieceInitiale();
                array_push($listFinal, $i);
                $piece->addEquivalent($i);
                foreach ($autreInitiaux as $pii)
                {  
                       if (!in_array($pii, $listFinal))
                       {
                          array_push($listFinal, $pii);
                          $piece->addEquivalent($pii);
                       }
                }
            }
            array_push($pieceFinales ,$piece);
    }
    return $pieceFinales ;  
}

我无法找到递归函数来提供正确的结果。

1 个答案:

答案 0 :(得分:1)

对于递归,你不能只有1个函数,至少需要2个

示例:

public function getEquivalentsByReference($reference)
{

    $products = $someModel->getProductsByReference($reference);
    $this->_getRecursiveEquivalents($products);
    return $products;

}

protected function _getRecursiveEquivalents(&$products)
{
    $equivalents = [];
    foreach($products as $product) {
        $equivalents[] = $someModel->getReferencesByID($product->reference);
    }
    $this->_getRecursiveEquivalents($equivalents);
    $products = array_merge($products, $equivalents)


}