2017-09-11 175 views
1

我試圖實現一些簡單的事情,如爲每個元素重複顏色。php重複循環無限

這裏是我的功能:

function colors() { 
    $colorArray = array('#f44336', '#9c27b0', '#e91e63'); 
    return $colorArray[array_rand($colorArray)]; 
} 



<ul> 
    <li style="color:<?php echo colors(); ?>"><span>Word</span></li> 
    <li style="color:<?php echo colors(); ?>"><span>Word</span></li> 
    <li style="color:<?php echo colors(); ?>"><span>Word</span></li> 
    <li style="color:<?php echo colors(); ?>"><span>Word</span></li> 
    <li style="color:<?php echo colors(); ?>"><span>Word</span></li> 
    <li style="color:<?php echo colors(); ?>"><span>Word</span></li> 
    <li style="color:<?php echo colors(); ?>"><span>Word</span></li> 
    <li style="color:<?php echo colors(); ?>"><span>Word</span></li> 
    <li style="color:<?php echo colors(); ?>"><span>Word</span></li> 
    <li style="color:<?php echo colors(); ?>"><span>Word</span></li> 
    <li style="color:<?php echo colors(); ?>"><span>Word</span></li> 
    <li style="color:<?php echo colors(); ?>"><span>Word</span></li> 
    <li style="color:<?php echo colors(); ?>"><span>Word</span></li> 
    <li style="color:<?php echo colors(); ?>"><span>Word</span></li> 
    <li style="color:<?php echo colors(); ?>"><span>Word</span></li> 
    <li style="color:<?php echo colors(); ?>"><span>Word</span></li> 
    <li style="color:<?php echo colors(); ?>"><span>Word</span></li> 
    <li style="color:<?php echo colors(); ?>"><span>Word</span></li> 
    <li style="color:<?php echo colors(); ?>"><span>Word</span></li> 
    <li style="color:<?php echo colors(); ?>"><span>Word</span></li> 
    <li style="color:<?php echo colors(); ?>"><span>Word</span></li> 
    <li style="color:<?php echo colors(); ?>"><span>Word</span></li> 
    <li style="color:<?php echo colors(); ?>"><span>Word</span></li> 
    <li style="color:<?php echo colors(); ?>"><span>Word</span></li> 
</ul> 

這工作得很好,但我想不會有隨機顏色,而是保持從陣列重複第3種顏色。我可以有多達500個項目,所以循環必須能夠運行無限。

+1

哪個循環? –

+1

idk您想要做什麼?超過3種顏色?無限量的清單項目? –

+0

請查看[問]並修改您的問題。 –

回答

1

如果你想交替三種顏色,那麼你需要保留最後使用的顏色記錄。下面是一個簡單的修改您的功能要求使用static可變的:

function colors() { 
    static $colorCounter = -1; 
    $colorArray = array('#f44336', '#9c27b0', '#e91e63'); 
    $colorCounter++; 
    return $colorArray[$colorCounter % count($colorArray)]; 
} 

這裏是示例輸出(三種顏色重複無限): https://eval.in/859522

+0

只要您將計數器設置爲全局變量,爲什麼不將顏色設置爲全局以避免每次調用時重新分配? – musicnothing

+0

我對OPs代碼進行了最少量的更改,但這是一個很好的觀點。 – neuromatter

+0

這很有道理。 – musicnothing

0

創建一個全局變量來存儲每個索引它使用的時間。在每次迭代期間增加該變量 - 如果大於數組的計數返回零。

// Create a global variable 
$current_color = -1; 

function colors() { 
    // Access global var 
    global $current_color; 
    // Array of colors 
    $colorArray = array('#f44336', '#9c27b0', '#e91e63'); 
    // Increment global var 
    $current_color++; 
    // Return to zero if var is greater than the count of your array 
    $current_color = ($current_color < count($colorArray)) ? $current_color : 0; 
    // Return color 
    return $colorArray[$current_color]; 
} 
+0

@neuromatter **如果你的全局不是從-1開始,你將從第二個顏色開始。** – Dedering

1

使用CSS。

li:nth-child(3n+1) {color: #f44336;} 
li:nth-child(3n+2) {color: #9c27b0;} 
li:nth-child(3n+3) {color: #e91e63;} 

乾淨多了:P

+0

如果OP可以在沒有IE8支持的情況下生存,那麼這是一個很好的CSS選擇。 – neuromatter

0

任何的藉口,有樂趣InfiniteIterator

<?php 
class Colors 
{ 
    private $infinite; 

    public function __construct(array $colors) 
    { 
     $this->infinite = new InfiniteIterator(new ArrayIterator($colors)); 
     $this->infinite->rewind(); 
    } 

    public function get() 
    { 
     $return = $this->infinite->current(); 
     $this->infinite->next(); 

     return $return; 
    } 
} 

$colors = new Colors(['#111', '#222', '#333']); 

只要打電話echo $colors->get()每當你想要的顏色。請參閱https://eval.in/859523