У меня есть PHP-массив, похожий на этот:
0 => "red", 1 => "green", 2 => "blue", 3 => "yellow"
Я хочу переместить желтый в индекс 0. Как мне это сделать?
Изменить: Мой вопрос: как перенести любой из этих элементов в начало? Как бы я переместил зеленый в индекс 0 или синий в индекс 0? Этот вопрос связан не только с перемещением последнего элемента в начало.
Мне кажется, это самый простой способ. Вы можете перенести любую позицию в начало, а не только на последнюю (в этом примере она перемещается синим цветом в начало).
$colours = array("red", "green", "blue", "yellow"); $movecolour = $colours[2]; unset($colours[2]); array_unshift($colours, $movecolour);
не$colours = array("red", "green", "blue", "yellow"); $movecolour = $colours[2]; unset($colours[2]); array_unshift($colours, $movecolour);
Вероятно, самый простой способ
array_unshift( $arr, array_pop( $arr ) );
За ваш комментарий «как я могу взять любой один индекс из массива и перенести его в начало», мой ответ выше не полностью удовлетворяет этому запросу – он работает только путем перемещения последнего элемента в индекс 0.
Однако эта функция удовлетворяет этому запросу
/** * Move array element by index. Only works with zero-based, * contiguously-indexed arrays * * @param array $array * @param integer $from Use NULL when you want to move the last element * @param integer $to New index for moved element. Use NULL to push * * @throws Exception * * @return array Newly re-ordered array */ function moveValueByIndex( array $array, $from=null, $to=null ) { if ( null === $from ) { $from = count( $array ) - 1; } if ( !isset( $array[$from] ) ) { throw new Exception( "Offset $from does not exist" ); } if ( array_keys( $array ) != range( 0, count( $array ) - 1 ) ) { throw new Exception( "Invalid array keys" ); } $value = $array[$from]; unset( $array[$from] ); if ( null === $to ) { array_push( $array, $value ); } else { $tail = array_splice( $array, $to ); array_push( $array, $value ); $array = array_merge( $array, $tail ); } return $array; }
И, в использовании
$arr = array( 'red', 'green', 'blue', 'yellow' ); echo implode( ',', $arr ); // red,green,blue,yellow // Move 'blue' to the beginning $arr = moveValueByIndex( $arr, 2, 0 ); echo implode( ',', $arr ); // blue,red,green,yellow
Эта функция позволит вам перемещать элемент в произвольное положение в массиве, оставив остальную часть массива нетронутой:
function array_reorder($array, $oldIndex, $newIndex) { array_splice( $array, $newIndex, count($array), array_merge( array_splice($array, $oldIndex, 1), array_slice($array, $newIndex, count($array)) ) ); return $array; }
Надеемся, что использование довольно очевидно, так что:
$array = array('red','green','blue','yellow',); var_dump( array_reorder($array, 3, 0), array_reorder($array, 0, 3), array_reorder($array, 1, 3), array_reorder($array, 2, 0) );
Выведет это:
array(4) { [0]=> string(6) "yellow" [1]=> string(3) "red" [2]=> string(5) "green" [3]=> string(4) "blue" } array(4) { [0]=> string(5) "green" [1]=> string(4) "blue" [2]=> string(6) "yellow" [3]=> string(3) "red" } array(4) { [0]=> string(3) "red" [1]=> string(4) "blue" [2]=> string(6) "yellow" [3]=> string(5) "green" } array(4) { [0]=> string(4) "blue" [1]=> string(3) "red" [2]=> string(5) "green" [3]=> string(6) "yellow" }
Вы хотите переместить один из элементов в начало. Допустим,
$old = array( 'key1' =>'value1', 'key2' =>'value2', 'key3' =>'value3', 'key4' =>'value4');
И вы хотите переместить key3 в начало.
$new = array(); $new['key3'] = $old['key3']; // This is the first item of array $new foreach($old as $key => $value) // This will continue adding $old values but key3 { if($key != 'key3')$new[$key]=$value; }
РЕДАКТИРОВАНИЕ
Это обновление, основанное на вопросе и симпатизирующее родовым аспектам ответа Питера Бейли. Однако для меня слишком интенсивно работает функция / память, поэтому ниже просто выполняется своп значений $ from и $ to. Этот метод не приводит к изменению размера массива вообще, он просто меняет значения внутри него.
Второе редактирование: я добавил еще несколько аргументов, как указано в комментариях.
function moveValueByIndex( array $array, $from=null, $to=null ) { // There is no array, or there are either none or a single entry if ( null === $array || count($array) < 2 ) { // Nothing to do, just return what we had return $array; } if ( null === $from ) { $from = count( $array ) - 1; } if ( null === $to ) { $to = 0; } if ( $to == $from ) { return $array; } if ( !array_key_exists($from, $array) ) { throw new Exception( "Key $from does not exist in supplied array." ); } $value = $array[$from]; $array[$from] = $array[$to]; $array[$to] = $value; return $array; }
Простите меня, если бы я только что добавил это в комментарии к записи Питера. Это было слишком долго, чтобы включить все это там: /
Это очень похоже на ответ SharpC, но объясняет тот факт, что вы можете не знать, где значение находится в массиве (это ключ), или если оно даже установлено. Проверка «if» пропустит его, если цвет не установлен или если он уже является первым элементом в массиве.
$color = 'yellow'; $color_array = array("red", "green", "blue", "yellow"); $key = array_search($color, $color_array); if ($key > 0) { unset($color_array[$key]); array_unshift($color_array, $color); }
с$color = 'yellow'; $color_array = array("red", "green", "blue", "yellow"); $key = array_search($color, $color_array); if ($key > 0) { unset($color_array[$key]); array_unshift($color_array, $color); }
$array = array( 'red', 'green', 'blue', 'yellow', ); $last = array_pop($array); array_unshift($array, $last);
$a = array('red','green', 'blue','yellow'); $b = array_reverse( $a );
Если ваш вопрос заключается в том, как сделать последнее, станет первым.
Вы можете сделать так:
$array = array("red", "green", "blue", "yellow"); $last = array_pop($array); array_unshift($array, $last); print_r($array);
Результат:
Array ( [0] => yellow [1] => red [2] => green [3] => blue )
Если вы не всегда планируете принести самый последний объект в начало массива, это будет самый простой способ сделать это …
$array = array('red','green','blue','yellow'); unset($array[array_search($searchValue, $array)]); array_unshift($array, $searchValue);
Если кто-то все еще ищет ответ, это альтернативный способ.
$colors = array("red","green","blue","yellow"); $color_to_move = ["yellow"]; $colors_wo_yellow = array_diff($colors, $color_to_move);// This will give an array without "yellow" //Now add "yellow" as 1st element to $ array_unshift($colors_wo_yellow,$color_to_move[0]);
Вот и все. 🙂
PHP: переместить любой элемент в первую или любую позицию:
$sourceArray = array( 0 => "red", 1 => "green", 2 => "blue", 3 => "yellow" ); // set new order $orderArray = array( 3 => '', 1 => '', ); $result = array_replace($orderArray, $sourceArray); print_r($result);