Обработать массив как круглый массив при выборе элементов – 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, которая превращает массив в круглый массив? Я думаю, мне нужно использовать модульный оператор для этого.

Получите размер кругового массива ( $circsize ), а затем $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] . ', '; } 

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

 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 "; } 

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

  $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); } 

Если вы используете PHP 5.5 или выше, вы можете воспользоваться генераторами php и ключевым словом 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, 

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