PHP: «вращать» массив? - PullRequest
       23

PHP: «вращать» массив?

16 голосов
/ 09 апреля 2011

возможно ли легко "вращать" массив в PHP?

Как это: 1, 2, 3, 4 -> 2, 3, 4, 1

Есть ли какая-то встроенная функция PHP для этого?

Ответы [ 13 ]

22 голосов
/ 09 апреля 2011
  $numbers = array(1,2,3,4);
  array_push($numbers, array_shift($numbers));
  print_r($numbers);

выход

Array
(
    [0] => 2
    [1] => 3
    [2] => 4
    [3] => 1
)
21 голосов
/ 27 октября 2011

Большинство текущих ответов верны, но только если вы не заботитесь о своих показателях:

$arr = array('foo' => 'bar', 'baz' => 'qux', 'wibble' => 'wobble');
array_push($arr, array_shift($arr));
print_r($arr);

Выход:

Array
(
    [baz] => qux
    [wibble] => wobble
    [0] => bar
)

Чтобы сохранить свои индексы, вы можете сделать что-то вроде:

$arr = array('foo' => 'bar', 'baz' => 'qux', 'wibble' => 'wobble');

$keys = array_keys($arr);
$val = $arr[$keys[0]];
unset($arr[$keys[0]]);
$arr[$keys[0]] = $val;

print_r($arr);

Выход:

Array
(
    [baz] => qux
    [wibble] => wobble
    [foo] => bar
)

Возможно, кто-то может сделать вращение более лаконично, чем мой четырехстрочный метод, но это все равно работает.

6 голосов
/ 09 апреля 2011

Это очень просто и может быть сделано разными способами. Пример:

$array   = array( 'a', 'b', 'c' );
$array[] = array_shift( $array );
1 голос
/ 10 декабря 2016

Вы можете использовать эту функцию:

    function arr_rotate(&$array,$rotate_count) {
        for ($i = 0; $i < $rotate_count; $i++) {
            array_push($array, array_shift($array));
        }
    }

использование:

    $xarr = array('1','2','3','4','5');
    arr_rotate($xarr, 2);
    print_r($xarr);

результат:

 Array ( [0] => 3 [1] => 4 [2] => 5 [3] => 1 [4] => 2 )
1 голос
/ 11 сентября 2014

Метод для поддержания ключей и поворота. используя ту же концепцию, что и array_push (array, array_shift (array)), вместо этого мы будем использовать array_merge из 2 array_slices

$x = array("a" => 1, "b" => 2, "c" => 3, 'd' => 4);

Чтобы переместить Первый элемент в конец

array_merge(array_slice($x, 1, NULL, true), array_slice($x, 0, 1, true) //'b'=>2, 'c'=>3, 'd'=>4, 'a'=>1

Чтобы переместить последний элемент вперед

array_merge(array_slice($x, count($x) -1, 1, true), array_slice($x, 0, //'d'=>4, 'a'=>1, 'b'=>2, 'c'=>3

1 голос
/ 09 апреля 2011

Использование array_shift и array_push.

0 голосов
/ 07 мая 2019

Да, вот функция, которую я сделал сам, где $ A - это массив, а $ K - сколько раз вы хотите повернуть массив:

function solution($A, $K) {

  for($i = 0; $i < $K; $i++): //we cycle $K
    $arrayTemp = $A;
    for($j = 0; $j < count($arrayTemp); $j++): // we cycle the array
       if($j == count($arrayTemp) - 1) $A[0] = $arrayTemp[$j]; // we check for the last position
       else $A[$j + 1] = $arrayTemp[$j]; // all but last position
    endfor;
  endfor;
 return $A;

}
0 голосов
/ 27 февраля 2018

Циклический просмотр массива и shift -ing и push -ing могут быть распространенным способом вращения массива, однако он часто может испортить ваши ключи.Более надежный метод заключается в использовании комбинации array_merge и array_splice.

/**
 * Rotates an array.
 * 
 * Numerical indexes will be renumbered automatically.
 * Associations will be kept for keys which are strings.
 * 
 * Rotations will always occur similar to shift and push,
 * where the number of items denoted by the distance are
 * removed from the start of the array and are appended.
 * 
 * Negative distances work in reverse, and are similar to
 * pop and unshift instead.
 * 
 * Distance magnitudes greater than the length of the array
 * can be interpreted as rotating an array more than a full
 * rotation. This will be reduced to calculate the remaining
 * rotation after all full rotations.
 * 
 * @param array $array The original array to rotate.
 * Passing a reference may cause the original array to be truncated.
 * @param int $distance The number of elements to move to the end.
 * Distance is automatically interpreted as an integer.
 * @return array The modified array.
 */
function array_rotate($array, $distance = 1) {
    settype($array, 'array');
    $distance %= count($array);
    return array_merge(
        array_splice($array, $distance), // Last elements  - moved to the start
        $array                          //  First elements - appended to the end
    );
}
// Example rotating an array 180°.
$rotated_180 = array_rotate($array, count($array) / 2);

В качестве альтернативы, если вам также необходимо повернуть клавиши так, чтобы они совпадали с различными значениями, вы можете объединить array_keys, array_combine, array_rotate и array_values.

/**
 * Rotates the keys of an array while keeping values in the same order.
 * 
 * @see array_rotate(); for function arguments and output.
 */
function array_rotate_key($array, $distance = 1) {
    $keys = array_keys((array)$array);
    return array_combine(
        array_rotate($keys, $distance), // Rotated keys
        array_values((array)$array)    //  Values
    );
}

Или альтернативное вращение значений при сохранении ключей в том же порядке (эквивалентно вызову отрицательного расстояния для соответствующего array_rotate_keyвызов функции).

/**
 * Rotates the values of an array while keeping keys in the same order.
 * 
 * @see array_rotate(); for function arguments and output.
 */
function array_rotate_value($array, $distance = 1) {
    $values = array_values((array)$array);
    return array_combine(
        array_keys((array)$array),        // Keys
        array_rotate($values, $distance) //  Rotated values
    );
}

И, наконец, если вы хотите предотвратить перенумерацию числовых индексов.

/**
 * Rotates an array while keeping all key and value association.
 * 
 * @see array_rotate(); for function arguments and output.
 */
function array_rotate_assoc($array, $distance = 1) {
    $keys = array_keys((array)$array);
    $values = array_values((array)$array);
    return array_combine(
        array_rotate($keys, $distance),   // Rotated keys
        array_rotate($values, $distance) //  Rotated values
    );
}

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

Также должна быть возможность вращать массив с помощью пользовательской функции сортировки, но это, скорее всего, будет слишком сложным,то есть usort.

0 голосов
/ 19 января 2018

На Hackerrank есть задача о вращении массива: https://www.hackerrank.com/challenges/array-left-rotation/problem.

И предлагаемое решение с array_push и array_shift будет работать для всех тестовых случаев, кроме последнего, которое не выполняется из-за тайм-аута. Таким образом, array_push и array_shift дадут вам не самое быстрое решение.

Вот более быстрый подход:

function leftRotation(array $array, $n) {
   for ($i = 0; $i < $n; $i++) {
       $value = array[$i]; unset(array[$i]); array[] = $value;
   }
   return array;
}
0 голосов
/ 26 июля 2015

Пожалуйста, используйте встроенную функцию array_reverse. Это самый быстрый способ «вращать» массив в php.

http://php.net/manual/de/function.array-reverse.php

...