Как сдвинуть элемент массива вверх/вниз на php

Всем привет. В данной заметке опишу как можно сдвинуть элемент массива вверх или вниз. Для начала поясню что это за задача:

Допустим у нас есть некий список сущностей в системе, у которых есть свойство приоритет (или индекс сортировки). И есть админка со списком таких сущностей. Нам нужно написать метод, который позволит реализовать в админке контролы около каждой сущности в списке - сдвиг вверх и сдвиг вниз.

То есть на бэкэнд прилетает айдишник элемента и направление, и нам нужно пересчитать индекс сортировки у всех элементов списка, сдвинув данную сущность. Вот такой код я использую для реализации этого:

	/**
	 * @param Request $request
	 * @param int $id
	 * @param string $direction
	 * @return RedirectResponse
	 * @throws EntityNotFoundException
	 */
	public function changePriorityAction(Request $request, $id, $direction)
	{
		$entityManager = $this->get('my.entitymanager');
		$entities = $entityManager->getAll(); // Список с учетом сортировки

		$currentIndex = null;
		foreach ($entities as $i => $entity) {
			if ($entity->getId() == $id) {
				$currentIndex = $i;
			}
		}

		if (is_null($currentIndex)) {
			throw new EntityNotFoundException('Entity', $id);
		}

		if ($direction == 'down') {
			$newIndex = isset($entities[$currentIndex + 1]) ? $currentIndex + 1 : $currentIndex;
		}else {
			// Если направдление вверх, то все равно будем двигать вниз, только другой элемент (соседа сверху)
			$newIndex = $currentIndex;
			$currentIndex = isset($entities[$currentIndex - 1]) ? $currentIndex - 1 : $currentIndex;
		}

		if ($newIndex != $currentIndex) {
			array_splice($entities, min($currentIndex, $newIndex), 2, [$entities[$newIndex], $entities[$currentIndex]]);
		}

		foreach ($entities as $i => $entity) {
			$entity->setPriority(($i + 1) * 10);
			$entityManager->save($entity);
		}

		return $this->redirect($this->generateUrl('entity_list'));
	}

Видно что суть - использование php-функции array_splice, с помощью которой я заменяю два элемента массива на те же два элемента, но в обратном порядке.

Добавить комментарий