2012-09-02 87 views
1

要隨機PHP中的數組之前或之後很容易,但我的問題是,當我嘗試將它洗而不該鍵前後得到相同的結果。洗牌PHP數組不相同的值

實施例:

Array (0 => 1, 1 => 2, 2 => 3, 3 => 3) 

我必須具有無3的結果來在一起。一些陣列我想要的

例子:

Array (0 => 2, 1 => 3, 2 => 1, 3 => 3) 

我tryed檢查數組的每個項目,如果出現這種情況,我再次將它洗,並檢查其他時間。但這似乎是浪費時間和過程。

編輯: 這裏是我使用的代碼:

do 
{ 
    $not_valid=false; 
    for($i=0;$i<sizeof($arr_times)-1;$i++){ 
     if($arr_times[$i]==$arr_times[$i+1]) 
      $not_valid=true; 
    } 
    if($not_valid) 
     shuffle($arr_times); 
}while ($not_valid); 
+0

,什麼是你的問題? – zerkms

+0

有沒有任何可能的方式做到這一點,而不必每次我洗牌時再讀整個數組? –

+0

實際上,我不會驚訝那個PHP有'shuffle_without_same_value_before'函數,因爲它已經有一些奇怪的。但在這種情況下 - 不,事實並非如此。你必須手動完成。 – zerkms

回答

0

即使PHP有真的很奇怪的功能 - 它沒有任何所描述的情況。

所以,你必須這樣做手工。

PS:也將是一個不錯的主意,以檢查是否它甚至有可能重新洗牌以預期的方式輸入數組,這樣你就不會進入一個無限循環。

+0

對於我在「編輯」區域提出的問題,我是否有任何好的想法? –

+0

@Luiz Felipe:很好 – zerkms

0

Shuffle list, ensuring that no item remains in same position

<?php 
$foo = array(
    0, 
    1, 
    2, 
    3, 
    4, 
); 

for ($i = 0, $c = sizeof($foo); $i < $c - 1; $i++) { 
    $new_i = rand($i + 1, $c - 1); 
    list($foo[$i], $foo[$new_i]) = array($foo[$new_i], $foo[$i]); 
} 

var_export($foo); // Derangement 
+0

所以你的解決方案是在第一次洗牌後使用這種隨機數,如果數組有相同的項目? –

+0

我的解決方案是使用此循環來隨機化。 –

+0

@arxanas:目前的問題與「洗牌清單無關,確保沒有物品保持在同一位置」。您的代碼**並不保證**連續不會有重複項目 – zerkms