2015-07-02 5 views
0

Пытается получить предмет случайно из массива ($colors), не имея двух одинаковых цветов рядом друг с другом.php случайный элемент из массива no siblings

<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

можно перетасовать только один раз массив 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

Это не совсем случайным образом, так как в случае, если у вас есть один и тот же цвет снова , нам нужно будет сделать математический расчет, чтобы получить другой цвет. Мы можем использовать цикл while, который запускает функцию rand, но я считаю, что она неэффективна, особенно когда мы говорим о получении случайных цветов для визуальной цели.

Не самое яркое решение, но я считаю, что он может справиться с этой задачей.

$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; 
    ... 
    }