2015-06-30 28 views
12

我有一個數組,我循環。我有另一個數組,我需要從中選擇一個,但它需要在圓上以防止它到達數組的末尾。爲了讓這裏明確的是一些代碼:當選擇元素時將數組視爲圓形數組 - 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,將數組變成圓形數組?我想我需要使用模塊化操作來實現這一點。

回答

18

獲取圓形數組的大小($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

請用剩餘的圓形數組索引:

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

我喜歡克里斯沃爾什的,但這裏是一個替代,也適用於關聯數組(非整數索引)。也許可以縮短:

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

如果數組元素的值是falsey。每當圓形到達該元素時,「圓形」將返回到數組的開頭。 – Barmar

+0

謝謝。編輯檢查'===錯誤'。所以數組元素可能是'false',但是哦。 – AbraCadaver

+0

只要'false'不是數組的有效元素,這種解決方案就可以工作。使用模量的解決方案更加普遍。 – Barmar

1

如果您正在使用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, 

P. S.你正在尋找什麼,很容易導致內存耗盡,所以如果可以的話,找到另一種解決方案,而不是依賴於(受控)無限循環:)