У меня есть документ «Операция» в проекте 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()
затронутые элементы попадают в нижнюю часть коллекции Array. Например, скажем, у меня есть команды ['cd', 'ls', touch', 'mv']
, Если я пытаюсь поменять местами индексы 0 и 1, я получу [touch', 'mv', 'ls', 'cd']
, Как я могу поменять два элемента в коллекции массивов? Моим последним средством будет вручную пересмотреть коллекцию и add()
каждый элемент …
Лучший способ, который я нашел, чтобы сделать эту работу, но не самый элегантный:
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]);
}
}
Других решений пока нет …