我有一个数组,在上面循环。我有另一个数组,我需要从中一个接一个地选择,但它需要绕一圈,以防它到达数组的末尾。这里有一些代码:
$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
)的大小,然后根据它对值$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] . ', ';
}
我喜欢Chris Walsh的,但这里有一个替代方案,也适用于关联数组(非整数索引)。可能会缩短:
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];
}
}
因此,除非为$limit
参数传递另一个值,否则此方法将在给定数组上循环1000次。这是一个用例:
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.您正在寻找的东西很容易导致内存耗尽,因此如果可以的话,请找到另一个解决方案,而不是依赖于(受控的)无限循环:)