Marc Ermshaus’ avatar

Marc Ermshaus

Linkblog

PHP snippet: Circular shifting of an array

Published on 25 Apr 2011. Tagged with php.

<?php // This code is public domain. The original author is Marc Ermshaus.

error_reporting(-1);

/**
 * Circularly shifts an array
 *
 * Shifts to right for $steps > 0. Shifts to left for $steps < 0. Keys are
 * preserved.
 *
 * @param  array $array Array to shift
 * @param  int   $steps Steps to shift array by
 * @return array Resulting array
 */
function array_shift_circular(array $array, $steps = 1)
{
    if (!is_int($steps)) {
        throw new InvalidArgumentException(
                'steps has to be an (int)');
    }

    if ($steps === 0) {
        return $array;
    }

    $l = count($array);

    if ($l === 0) {
        return $array;
    }

    $steps = $steps % $l;
    $steps *= -1;

    return array_merge(array_slice($array, $steps),
                       array_slice($array, 0, $steps));
}



header('content-type: text/plain');

$a = range(0, 9);

$l = count($a);

for ($i = $l * -2; $i <= $l * 2; $i++) {
    printf("% 3s  :  %s\n", $i, implode(', ', array_shift_circular($a, $i)));
}