Symfony 3 - 2个阵列集合之间的差异

7xllpg7q  于 2022-12-23  发布在  其他
关注(0)|答案(3)|浏览(123)

是否有办法区分2个数组集合?(如array_diff)
今天我在第一个上循环并检查$it-〉contains()是否匹配,但是我认为它可以被重构。

x4shl7ld

x4shl7ld1#

可以按以下方式使用array_diff:

$diff = array_diff($arrayCollection1->toArray(), $arrayCollection2->toArray());

$arrayCollectionDiff = new ArrayCollection($diff);
af7jpaap

af7jpaap2#

我谨提出以下建议:
由两个函数组成的类:

  • 函数getElementFromANotInB给出了来自数组集合A而不在数组集合B中的元素(也可以以相反的方式使用以从B获得不在A中的元素);
  • 函数getElementCommonInAAndB给出了数组集合A和B的公共元素。

下面是课程:

<?php
namespace [Bundle name]\DependencyInjection\ToolBox\ArrayCollectionTB;
use Doctrine\Common\Collections\ArrayCollection;
class ArrayCollectionTB {
    public function __construct(){}
    public function getElementFromANotInB(ArrayCollection $acA,ArrayCollection $acB){
        return $elementsInANotInB = $acA->filter(function($a) use ($acB) {
            return $acB->contains($a)===false;
        });
    }

    public function getElementCommonInAAndB(ArrayCollection $acA,ArrayCollection $acB){
        return $elementsCommonInAAndB = $acA->filter(function($a) use ($acB) {
            return $acB->contains($a)===true;
        });

    }
}
?>

下面是它附带的测试类:

<?php
namespace Tests\[Bundle name]\DependencyInjection\ToolBox\ArrayCollectionTB;

use [Bundle name]\DependencyInjection\ToolBox\ArrayCollectionTB\ArrayCollectionTB;
use Doctrine\Common\Collections\ArrayCollection;

use PHPUnit\Framework\TestCase;
use Symfony\Bundle\FrameworkBundle\Test\KernelTestCase;

/**
* @coversDefaultClass [Bundle name]\DependencyInjection\ToolBox\ArrayCollectionTB
*/
class ArrayCollectionTBTest extends KernelTestCase{

    private static $acA;
    private static $acB;
    private static $acTB;

    public static function setUpBeforeClass()
    {
        //start the symfony kernel
        $kernel = static::createKernel();
        $kernel->boot();
        //get the DI container
        $container = $kernel->getContainer();

        self::$acA = new ArrayCollection();
        self::$acB = new ArrayCollection();

        //acA and acB have in common 1,5
        //acA has 2 and 3 not in acB
        self::$acA->add('element 1');
        self::$acA->add('element 2');
        self::$acA->add('element 3');
        self::$acA->add('element 5');
        //acB has 4 and 6 not in acA
        self::$acB->add('element 1');
        self::$acB->add('element 4');
        self::$acB->add('element 5');
        self::$acB->add('element 6');

        self::$acTB = new ArrayCollectionTB();
    }

    /**
    * @covers ::getElementFromANotInB
    * @testdox test check dif give element from ArrayCollection A not in ArrayCollection B
    */
    public function testGetElementFromANotInB(){
        $res = self::$acTB->getElementFromANotInB(self::$acA,self::$acB);
        //result should be  2 and 3
        $this->assertNotContains('element 1',$res);
        $this->assertContains('element 2',$res);
        $this->assertContains('element 3',$res);
        $this->assertNotContains('element 4',$res);
        $this->assertNotContains('element 5',$res);
        $this->assertNotContains('element 6',$res);

    }

    /**
    * @covers ::getElementFromANotInB
    * @testdox test check dif give element from ArrayCollection B not in ArrayCollection A
    */
    public function testGetElementFromBNotInA(){
        $res = self::$acTB->getElementFromANotInB(self::$acB,self::$acA);
        $this->assertNotContains('element 1',$res);
        $this->assertNotContains('element 2',$res);
        $this->assertNotContains('element 3',$res);
        $this->assertContains('element 4',$res);
        $this->assertNotContains('element 5',$res);
        $this->assertContains('element 6',$res);
    }

    /**
    * @covers ::getElementCommonInAAndB
    * @testdox test check gives element from ArrayCollection A and ArrayCollection A
    */
    public function testGetElementFromBAndA(){
        $res = self::$acTB->getElementCommonInAAndB(self::$acB,self::$acA);
        $this->assertContains('element 1',$res);
        $this->assertNotContains('element 2',$res);
        $this->assertNotContains('element 3',$res);
        $this->assertNotContains('element 4',$res);
        $this->assertContains('element 5',$res);
        $this->assertNotContains('element 6',$res);
    }
}
?>
8ftvxx2r

8ftvxx2r3#

当ArrayCollection是对象数组时:

$collFoo = ArrayCollection($arrayOfFooObjects);
$collBar = ArrayCollection($arrayOfBarObjects);

$diff = $collFoo->filter(function (Foo $fooObject) use ($collBar) {
    return !$collBar->contains($fooObject);
});

简单的array_diff抛出一个错误:Error: Object of class Foo could not be converted to string

相关问题