Here's my bid. Tried to make it as flexible as possible:
function array_rotate(){
$args = func_get_args();
$argc = func_num_args();
// check if all items are arrays and also get the
// length of the longest array
$maxCount = 0;
foreach ($args as $arg){
if (!is_array($arg))
throw new ArgumentException("array_rotate: All arguments must be arrays");
$_count = count($arg);
if ($_count > $maxCount)
$maxCount = $_count;
}
// setup the returned result
$result = array_fill(0, $argc, array());
// iterate over all items
for ($v = 0; $v < $argc; $v++){
for ($h = 0; $h < $maxCount; $h++){
$result[$h][$v] = isset($args[$v][$h]) ? $args[$v][$h] : null;
}
}
return $result;
}
And example usage:
$newAry = array_rotate(
array('a1','a2','a3'),
array('b1','b2','b3'),
array('c1','c2','c3')
);
// above yields:
Array
(
[0] => Array
(
[0] => a1
[1] => b1
[2] => c1
)
[1] => Array
(
[0] => a2
[1] => b2
[2] => c2
)
[2] => Array
(
[0] => a3
[1] => b3
[2] => c3
)
)
And in cases of uneven arrays, null is returned:
print_r(array_rotate(
array('a1','a2'),
array('b1','b2','b3','b4'),
array('c1','c2','c3')
));
// above yields:
Array
(
[0] => Array
(
[0] => a1
[1] => b1
[2] => c1
)
[1] => Array
(
[0] => a2
[1] => b2
[2] => c2
)
[2] => Array
(
[0] =>
[1] => b3
[2] => c3
)
[3] => Array
(
[0] =>
[1] => b4
[2] =>
)
)