2015-07-02 67 views
0

嘗試從數組中隨機獲取一個項目($colors),而沒有兩個相同的顏色相鄰。從數組中的無序元素沒有兄弟姐妹

<div class="list"> 
    <?php 
    foreach ($team as $member): 
    $index++; 
    ?> 
    <div class="member location-<?php echo strtolower($member->location); ?>"> 
    <a style="background: #FFF url('<?php echo $member->profileImage; ?>') no-repeat;" data-start-date="<?php echo $member->startDate; ?>"> 
     <?php shuffle($colors); // Shuffle the array ?> 
     <span class="name" style="background-color: #<?php echo array_pop($colors)->color; ?>"><?php echo $member->name; ?></span> 
     <span class="job-title"><span class="text"><?php echo $member->jobTitle; ?></span></span> 
    </a> 
    </div> 
    <?php endforeach; ?> 
</div> 

現在我有一些情況,當我得到一個顏色相鄰的顏色。

我如何獲得每次不同的顏色?我想提一下count($team) > count($colors)(更大)。

UPDATE:

$顏色看起來像(我剛剛印刷3項,計數較高)

array(18) { 
     [0]=> 
     object(stdClass)#112 (1) { 
     ["color"]=> 
     string(6) "5ebedb" 
     } 
     [1]=> 
     object(stdClass)#111 (1) { 
     ["color"]=> 
     string(6) "c75d40" 
     } 
     [2]=> 
     object(stdClass)#110 (1) { 
     ["color"]=> 
     string(6) "faaf37" 
    } 
    } 
+0

所以它真的不是隨機的;) –

+0

,你可以在foreach洗牌之前只有一次collors的陣列,也是一個問題你的數組$顏色具有不同的顏色或者有一些人不止一次? – knetsi

+0

總會有一些情況下,你有顏色相鄰,你現在做事的方式。無論如何,這是一個有趣的問題。我們應該從「相同顏色」(我們在相同的色調範圍內談話?)中理解什麼?你需要某種方式來告訴兩種顏色何時「不一樣」。 – Andrew

回答

1

這裏是你如何做到這一點。我對html標籤進行了分條,使我的解決方案更易於理解。

$colors = [...]; // see your definition of the $color array 
$colorCount = count($colors); 
$lastColorId = null; 
foreach ($team as $member) 
{ 
    // choose a random color 
    $colorId = rand(0,$colorCount-1); 
    if ($lastColorId == $colorId) 
    { 
     // take the next color if it's the same as the previous one 
     $colorId = ($colorId + 1) % $colorCount; 
    } 
    $lastColorId = $colorId; 
    // Get the color 
    $color = $colors[$colorId]->color; 
} 
0

它,因爲如果你有相同的顏色不是真正的隨機再次 我們必須做一個數學計算來獲得另一種顏色。 我們可以使用運行rand函數的while循環,但我認爲它效率不高,特別是當我們正在討論爲了視覺目的獲取隨機顏色時。

不是最明智的解決方案,但我相信它可以完成這項工作。

$colors = array('blue','red','green'); 

function getRandomColor($colors, $lastIndex = null){ 
    $rand = floor(rand(0, count($colors))); 
    if(isset($lastIndex) && $rand == $lastIndex){ 
    if($rand == 0) 
     $rand++; 
    else //prevent offset: ($rand == count($colors)) 
     $rand--; 
    } 
    return array('color' => $colors[$rand], 'lastIndex' => $rand); 
} 

使用,首次使用:

$rand_color = getRandomColor($colors); 

和之後的第一循環使用:

$rand_color = getRandomColor($colors, $rand_color['lastIndex']); 

您可以簡單地用一個簡單的條件的事項,以檢查是否$rand_color已經設定或沒有設定。

0
<? 
$color1 = array(); 

    foreach ($team as $member) { 
    // make copy of array everytime it beome empty. And work with the copy 
    if (! $color1) { $color1 = $colors; shuffle($colors); } 
    .... 
    echo array_pop($color1)->color; 
    ... 
    }