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

recursive function to get all equivalents product using php

我正在使用 symfony 3,我有 table 多对多关系 Self-referencing 。 一件有许多等价件。 一个等价的作品与许多作品相关联。

例如:

件 : 件 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 个函数,你至少需要 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)


}