eo

PHP snippet: Circular shifting of an array

Written on 25 Apr 2011. Tags: post , dc:language=en , 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)));
}

308/316