Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Treat an array as circular array when selecting elements - PHP

Tags:

arrays

php

I have an array on which I loop over. I have another array from which I need to select one by one but it needs to go on circle in case it gets to the end of the array. To make it clear here is some code:

$mainArray = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
$size      = count($mainArray);
$circular  = array('A', 'B', 'C');

for($i = 0; $i < $size; $i++) {
   echo $mainArray[$i] . ' = ' . $circular[$i] . ', ';
}

Now above code prints this:

1 = A, 2 = B, 3 = C, UNDEFINED INDEX ERROR

What I need it to print is this:

1 = A, 2 = B, 3 = C, 4 = A, 5 = B, 6 = C, 7 = A, 8 = B, 9 = C, 10 = A

Is there a built in function to PHP that turns an array into circular array? I think I need to use modular operator to achieve this.

like image 761
GGio Avatar asked Jun 30 '15 14:06

GGio


2 Answers

I like Chris Walsh's but here is an alternate that also works for associative arrays (non-integer indexes). Could probably be shortened:

foreach($mainArray as $main) {
    if(($circ = current($circular)) === false) {
        $circ = reset($circular);
    }
    next($circular);
    echo "$main=$circ ";
}

If you need this more than once, maybe a function:

function circular(&$array) {
    if(($result = current($array)) === false) {
        $result = reset($array);
    }
    next($array);

    return $result;
}

Then just use:

foreach($mainArray as $main) {
    $circ = circular($circular);
    echo "$main=$circ ";
}
like image 138
AbraCadaver Avatar answered Sep 28 '22 03:09

AbraCadaver


Get the size of the circular array ($circsize)and then mod the value $i against it and use that as your index:

$mainArray = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
$size      = count($mainArray);
$circular  = array('A', 'B', 'C');
$circsize  = count($circular);

for($i = 0; $i < $size; $i++) {
   echo $mainArray[$i] . ' = ' . $circular[$i % $circsize] . ', ';
}
like image 38
Chris Walsh Avatar answered Sep 28 '22 04:09

Chris Walsh