2017-09-11 105 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