Обмен двух элементов в Doctrine ArrayColection

0

У меня есть документ "Операция" в проекте 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() каждого элемента...

  • 0
    ваша функция подкачки работает хорошо ... проверьте, как вы создаете экземпляры команд (или выкидываете их перед свопом)
  • 0
    Вы уверены, что это правильно с ArrayCollections?
Показать ещё 7 комментариев
Теги:
doctrine-odm

1 ответ

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]);
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню