Перемещение вверх / вниз элемента в массиве по его значению

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

Если пользователь хочет переместить порядок предметов вверх:

 $desired_item_to_move = 'banana'; $default_order = array('orange', 'apple', 'banana', 'pineapple', 'strawberry'); // Typically it should return this: array('orange', 'banana', 'apple', 'pineapple', 'strawberry'); 

Поскольку вы можете видеть, что banana и apple были заменены, из-за того, что banana перемещается вверх, если пользователь хочет его переместить, он должен заменить pineapple на banana (из первого массива) и так далее.

Я огляделся по функциям, array_replace был ближе всего, но он заменяет только массивы.

Сдвиг (при условии, что вы проверили, что элемент еще не первый):

 $item = $array[ $index ]; $array[ $index ] = $array[ $index - 1 ]; $array[ $index - 1 ] = $item; 

Сдвиг вниз:

 $item = $array[ $index ]; $array[ $index ] = $array[ $index + 1 ]; $array[ $index + 1 ] = $item; 

Полезная функция для более общей проблемы перемещения элемента массива из одной позиции в другую:

 function array_move(&$a, $oldpos, $newpos) { if ($oldpos==$newpos) {return;} array_splice($a,max($newpos,0),0,array_splice($a,max($oldpos,0),1)); } 

Затем это можно использовать для решения конкретной проблемы в исходном вопросе:

 // shift up array_move($array,$index,$index+1); // shift down array_move($array,$index,$index-1); 

Обратите внимание: нет необходимости проверять, находится ли вы уже в начале / конце массива. Также обратите внимание, что эта функция не сохраняет ключи массива – перемещение элементов при сохранении ключей более затруднительно.

 $ret = array(); for ($i = 0; $i < count($array); $i++) { if ($array[$i] == $desired_item_to_move && $i > 0) { $tmp = array_pop($ret); $ret[] = $array[$i]; $ret[] = $tmp; } else { $ret[] = $array[$i]; } } 

Это переместит все экземпляры нужного элемента, положив новый массив в $ret .