Я не могу найти эффективного решения по перестановке / замене элемента массива на его значение, сдвинув его на- - 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
.