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

使用php获取所有等价产品的递归函数,php,doctrine-orm,symfony-3.3,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 = arr

我正在使用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 ;  
}

我找不到一个递归函数来给出正确的结果。

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

例如:

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)


}

你试过什么?你发布的内容没有用作递归函数。我试图用递归函数替换此代码,但我无法:(谢谢,你的回答帮助我找到解决方案,非常感谢:):Dyw,如果你愿意,请接受它,问题仍然是安静的