PHP: "повернуть" массив?

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

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

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

12 ответов


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

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

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


  $numbers = array(1,2,3,4);
  array_push($numbers, array_shift($numbers));
  print_r($numbers);

выход

Array
(
    [0] => 2
    [1] => 3
    [2] => 4
    [3] => 1
)

Это очень просто и может быть сделано во многих отношениях. Пример:

$array   = array( 'a', 'b', 'c' );
$array[] = array_shift( $array );

использовать array_shift и array_push.


логика заключается в замене элементов. Алгоритм может выглядеть так -

 for i = 0 to arrayLength - 1
    swap( array[i], array[i+1] )     // Now array[i] has array[i+1] value and 
                                     // array[i+1] has array[i] value.

метод для поддержания ключей и поворота. используя ту же концепцию, что и 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


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

    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 )

нет. Проверьте документацию для array_shift и связанные с ним функции для некоторых инструментов, которые можно использовать для записи. Может быть даже array_rotate функция реализована в комментариях этой страницы.

также стоит прочитать функции массива, перечисленные на левой боковой панели, чтобы получить полное представление о том, какие функции массива доступны в PHP.


$daynamesArray = array("Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday");
array_push($daynamesArray, array_shift($daynamesArray)); //shift by one
array_push($daynamesArray, array_shift($daynamesArray)); //shift by two
print_r($daynamesArray);

выход начинается в "среда":

Array ( [0] => Wednesday [1] => Thursday [2] => Friday [3] => Saturday [4] => Sunday [5] => Monday [6] => Tuesday 

есть задача о вращении массива на 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;
}

цикл через массив, и shiftи 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.


пожалуйста, используйте функцию build in array_reverse. Это самый быстрый способ "повернуть" массив в PHP.

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