Подтвердить что ты не робот

Переместить значение в массиве PHP в начало массива

У меня есть PHP-массив, похожий на это:

0 => "red",
1 => "green",
2 => "blue",
3 => "yellow"

Я хочу переместить желтый в индекс 0. Как это сделать?

Изменить: Мой вопрос: как перенести любой из этих элементов в начало? Как бы я переместил зеленый в индекс 0 или синий в индекс 0? Этот вопрос связан не только с перемещением последнего элемента в начало.

4b9b3361

Ответ 1

Мне кажется, это самый простой способ. Вы можете перенести любую позицию в начало, а не только на последнюю (в этом примере она перемещается синим цветом в начало).

$colours = array("red", "green", "blue", "yellow");

$movecolour = $colours[2];
unset($colours[2]);
array_unshift($colours, $movecolour);

Ответ 2

Вероятно, самый простой способ

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

Ответ 3

Эта функция позволит вам перемещать элемент в произвольную позицию в массиве, оставив остальную часть массива нетронутой:

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"
}

Ответ 4

Вы хотите переместить один из элементов в начало. Пусть говорят

$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;
}

Ответ 5

отредактированы

Это обновление, основанное на вопросе и симпатизирующее родовым аспектам ответа Питера Бейли. Однако для меня слишком интенсивно работает функция/память, поэтому ниже просто выполняется своп значений $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;
}

Простите меня, если бы я только что добавил это в комментарии к сообщению Питера. Это было слишком долго, чтобы включить все это там:/

Ответ 6

Это очень похоже на ответ 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);
}

Ответ 7

$array = array(
  'red',
  'green',
  'blue',
  'yellow',
);

$last = array_pop($array);
array_unshift($array, $last);

Ответ 8

$a = array('red','green', 'blue','yellow');

$b = array_reverse( $a );

Если ваш вопрос заключается в том, как сделать последнее, станет первым.

Ответ 9

Вы можете сделать следующее:

$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 ) 

Ответ 10

Если вы не всегда планируете принести самый последний объект в начало массива, это будет самый простой способ сделать это...

$array = array('red','green','blue','yellow');
unset($array[array_search($searchValue, $array)]);
array_unshift($array, $searchValue);

Ответ 11

Если кто-то все еще ищет ответ, это альтернативный способ.

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

Что это.:)

Ответ 12

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