2016-09-16 3 views
3

私はループを持つスライダを持っています(最後の要素の後に最初の要素が続きます)、3色の範囲に基づいて別の色を設定したいと思います。最後の要素が前の項目でも最初の要素でもない配列を取得する方法は?

したがって、2つの条件があります:前の色と次の色は同じであってはなりません。また、スライドの数量(配列内の要素)は異なる場合があります。

良い例:

Array 
(
    [0] => yellow 
    [1] => blue 
    [2] => red 
    [3] => yellow 
    [4] => red 
) 

悪い例(要素0および4は同じ色であるため):

Array 
(
    [0] => yellow 
    [1] => blue 
    [2] => yellow 
    [3] => red 
    [4] => yellow 
) 

複数の要素(と他の悪い例素子2及び3は同じであるので色:

Array 
(
    [0] => yellow 
    [1] => blue 
    [2] => red 
    [3] => red 
    [4] => blue 
    [5] => yellow 
    [6] => blue 
) 

これは私が試したものですが、これは良い方法だとは思わない:

色が(もちろん、前述の制限を除く)ランダムでできると仮定すると、
$i = 0; 
$bgcolors = array(); 
foreach($slides as $slide) { 
    switch ($i % 3) { 
     case 0: 
      $bgcolors[] = 'yellow'; 
      break; 
     case 1: 
      $bgcolors[] = 'blue'; 
      break; 
     case 2: 
      $bgcolors[] = 'red'; 
      break; 
    } 

    if ((count($slides) - $i) % 3 == 0) $i = 0; 

    $i++; 
} 
+0

最初の(良い)例では青い色にすべきでしょうか?または異なる2色の間にあるすべての色が必要ですか? –

+0

@HareshVidjaはい、そうです。前の色は赤で、次の色は黄色であるため、この場合は青だけが選択肢です。 – Dacobah

+0

あなたの条件を満たす最初の色のみを配列または複数の色で結ぶ必要がありますか? –

答えて

1

が、私は、これは良い方法だとは思わない

それは比較的エレガントで、結果を1回通して連続して一致する色を持たないようにします。しかし、それはjeroenによって提案された方法を使用してよりエレガントになる可能性があります。

ただし、リストの折り返しの問題は解決しません。明らかに、未知数のスライド(M)で、1番目のスライドが最後のスライドと同じ色に割り当てられるN個のチャンス(Nは色の数)に1個のチャンスがある。これが事実であるとき、動作するように簡単です:

M % N = 1 

だから、限りのM%Nは、それはあなたが心配する必要はありません問題があるものではありませんよう。M%Nが1の場合、の色を変更することを心配する必要があります。最初または最後のスライド。引数のために、最後のものの色を変更します。

これは、どの色を選択するかの問題を残しています。

変更がなければ、最後のスライドは最初のスライドと同じ色になります。サイクルの前の色に変更することはできません。最後から2番目のスライドと同じになります。

Joeroenのソリューションは、以前のスライドやそれ以降のスライドで使用されていない色を検索して適用するのが面倒です。それは必要以上のコードを使用します。リスト内の2番目の色を選択するだけです。

しかし、問題は2色(またはそれ以下)で解決できると言っても間違いです。

$colors = ['yellow', 'blue', 'red']; 
    if (count($slides)>count($colors) && 3>count($colors)) { 
     trigger_error("unsolvable"); 
    } 
    $i = 0; 
    $bgcolors = array(); 
    foreach($slides as $slide) { 
    $bgcolors[] = $colors[$i % count($colours)]; 
    $i++; 
    } 
    if (1 < count($slides) && 1 == count($slides) % count($colors)) { 
    $bgcolors[count($slides)-1]=$colors[1]; 
    } 
+0

最後の部分は分かりにくいです。しかし、正しい方法と思われます。 –

+0

私はこれがすべてのケースで解決できるとは断言できません。終わりのないループに入るのを避けるために、追加のチェックが必要です。しかし、はい、単純な数学を使ってこれをよりエレガントに解くことができます:-) – jeroen

0

$slides = array('slide1', 'slide2', 'slide3', 'slide4', 'slide5'); 
$colors = array('red', 'blue', 'yellow'); 
$bg_colors = array(); 

foreach ($slides as $key=>$value) { 
    if ($key == 0) { // First slide 
     $bg_colors[] = $colors[mt_rand(0, 2)]; // Get random color 
    } else { // Other slides 
     $usable_colors = $colors; // Duplicate colors array 
     $usable_colors = array_values(array_diff($usable_colors, array($bg_colors[$key-1]))); // Remove last used color and reset keys 
     if ($key == count($slides) -1) { // Last slide 
      $usable_colors = array_values(array_diff($usable_colors, array($bg_colors[0]))); // Remove first used color and reset keys 
     } 
     $bg_colors[] = $usable_colors[mt_rand(0, count($usable_colors)-1)]; // Get random color 
    } 
} 
1

あなたは配列にあなたの色を入れて起動する必要があります。

次に、配列の終わりに、あなたは以前にも最初の色が使用されてもないことを確認するためにいくつかのロジックを追加する必要があります:あなたは色場合の条件を追加する必要が

$colors = ['yellow', 'blue', 'red']; 
$i = 0; 
$bgcolors = array(); 
foreach($slides as $slide) { 
    $bgcolors[] = $colors[$i % 3]; 

    $i++; 

    if ($slide == end($slides) { 
     $j = $i; 
     while ($bgcolors[$i - 1] === $colors[$j % 3] || $bgcolors[0] === $colors[$j % 3]) { 
      $j++; 
     } 
     $bgcolors[] = $colors[$j % 3]; 
    } 
} 

注またはスライダーの配列は、2つの要素以下を持つことができます...

-1

私はあなたの質問を理解しているように、これを行うためにここに解決策

$i = 0; 
$bgcolors = array(); 
foreach($slides as $slide) { 
if ($i > 2) $i = 0; 
switch ($i) { 
    case 0: 
     $bgcolors[] = 'yellow'; 
     break; 
    case 1: 
     $bgcolors[] = 'blue'; 
     break; 
    case 2: 
     $bgcolors[] = 'red'; 
     break; 
} 

$i++; 
} 
0

があるクリーンな方法が異なるすべての可能な色を求めることです最後のものからスライダの最初のものまで、そしてランダムに1つをピックアップします。

function getColorsForElements($numbersOfElements) { 

$colors_array = array('red', 'blue', 'yellow'); 
$bg_colors = array(); 

for ($i = 0; $i < $numbersOfElements; $i++) { 
    if ($i == $numbersOfElements - 1) 
     $first_color = reset($bg_colors); 
    else 
     $first_color = false; 

    $last_color  = end($bg_colors); 

    $possible_colors = array_diff($colors_array, array($first_color, $last_color)); 

    $index = array_rand($possible_colors, 1); 
    array_push($bg_colors, $possible_colors[$index]); 
} 

return $bg_colors; 
} 

使用方法の一例は、結果として得られgetColorsForElements(5)です:

Array 
(
    [0] => yellow 
    [1] => blue 
    [2] => red 
    [3] => blue 
    [4] => red 
) 
+0

きれいな解決策ではありません。無理な力です。 – symcbean

+0

@symcbeanなぜですか? –

0
$colors = ['yellow', 'blue', 'red']; 
$bgcolors = array($colors[2]); 
for ($i = 1; $i < count($slides); ++$i) { 
    $bgcolors[] = $colors[$i%2]; 
} 

これはあなたの二つの条件を満たしている:コードのいかなる量はわずか2色となり1

より大きくスライドの奇数の場合に役立ちません。しかし、今ではおそらくあなたが私に3番目のものを教えてくれるでしょう。それは簡単ではないからです:-)

関連する問題