Обработать массив как круглый массив при выборе элементов - PHP

У меня есть массив, на котором я перехожу. У меня есть другой массив, из которого мне нужно выбрать один за другим, но ему нужно идти по кругу, если он попадает в конец массива. Для пояснения здесь приведен код:

$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] . ', ';
}

Теперь выше код печатает это:

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

Что мне нужно для печати:

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

Есть ли встроенная функция для PHP, которая превращает массив в круглый массив? Я думаю, что для этого нужно использовать модульный оператор.

Ответ 1

Получите размер кругового массива ($circsize), а затем измените значение $i на него и используйте его как ваш индекс:

$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] . ', ';
}

Ответ 2

Мне нравится Крис Уолш, но вот альтернатива, которая также работает для ассоциативных массивов (нецелые индексы). Вероятно, можно сократить:

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

Если вам это нужно больше одного раза, возможно, функция:

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

    return $result;
}

Затем просто используйте:

foreach($mainArray as $main) {
    $circ = circular($circular);
    echo "$main=$circ ";
}

Ответ 3

пожалуйста, используйте остаток для индекса круглой матрицы:

 $i2= $i % count($circular );
 echo $mainArray[$i] . ' = ' . $circular[$i2] . ', ';

В качестве альтернативы вы можете использовать foreach для итерации массивов и избегать использования арифметических вычислений для индекса:

reset($circular);
foreach($mainArray as $item){
     echo $item . ' = ' . current($circular);
     if(next($circular)===false) reset($circular);
}

Ответ 4

Если вы используете PHP 5.5 или выше, вы можете воспользоваться php generators и его yield ключевое слово:

function loopOnArrayFor($array, $limit = 1000)
{
    for ($i = 0 ; $i <= count($array) ; $i++) {
        if ( $i == count($array)) {
            if (--$limit > 0) {
                $i = 0;
            } else {
                break;
            }
        }
        yield $array[$i];
    }
}

Таким образом, этот метод будет зацикливаться на заданном массиве 1000 раз, если вы не передадите другое значение для аргумента $limit. вот прецедент:

foreach (loopOnArrayFor(['A','B','C'],5) as $v) {
    echo "$v ,";
}

что приводит к следующему результату:

A ,B ,C ,A ,B ,C ,A ,B ,C ,A ,B ,C ,A ,B ,C ,

Небольшая настройка даст нам ожидаемый результат:

$counter = 1;
foreach (loopOnArrayFor(['A','B','C'],5) as $v) {
    echo $counter++ . ' = ' . $v .', ' ;
}

Что-то вроде:

1 = A, 2 = B, 3 = C, 4 = A, 5 = B, 6 = C, 7 = A, 8 = B, 9 = C, 10 = A, 11 = B, 12 = C, 13 = A, 14 = B, 15 = C,

Р. S. То, что вы ищете, может легко привести к истощению памяти, поэтому, если вы можете, найти другое решение вместо того, чтобы полагаться на (контролируемый) бесконечный цикл:)