在Doctrine ArrayCollection中交换两个元素

时间:2014-12-23 11:21:58

标签: php symfony doctrine-odm

我有一份文件" Operation"在symfony2项目中,该项目包含其他文档的嵌入式集合"命令"。我试图写一个交换两个命令位置的动作。我试图将该集合视为普通的PHP数组,但行为并不像预期的那样。

class Operation
{
    ...
    /**
     * The sequence of commands
     * @MongoDB\EmbedMany(targetDocument="Command")
     */
    protected $commands;

    public function __construct()
    {
        $this->commands  = new \Doctrine\Common\Collections\ArrayCollection();
        $this->fallbacks = new \Doctrine\Common\Collections\ArrayCollection();
    }

    /**
     *
     */
    public function swapCommands($index1, $index2)
    {
        $temp = $this->commands[$index1];
        $this->commands[$index1] = $this->commands[$index2];
        $this->commands[$index2] = $temp;
    }
    ...
}

当我swapCommands()时,受影响的元素将落在数组集合的底部。例如,假设我有命令['cd', 'ls', touch', 'mv']。如果我尝试交换索引0和1,我得到[touch', 'mv', 'ls', 'cd']。如何在数组集合中交换两个元素?我的最后一招是手动遍历集合并add()每个元素......

1 个答案:

答案 0 :(得分:0)

我找到了最好的方法,但不是最优雅的方式:

public function swapCommands($index1, $index2)
{
    $arr  = $this->commands->toArray();
    $temp = $arr[$index1];
    $arr[$index1] = $arr[$index2];
    $arr[$index2] = $temp;

    $this->commands  = new \Doctrine\Common\Collections\ArrayCollection();
    for ($i=0; $i < count($arr); $i++) {
        $this->addCommand($arr[$i]);
    }
}