2012-03-04 8 views
0

это мой первый скрипт и проблема php, iv искали часы без вывода, кроме цикла, «слишком много переходов». но это не решает мою проблему IV никогда не изучал программирование или что-либо так им в надежде, что это образованный человек, чтобы заполнить меня на этом:PHP Array shuffle, сохраняя уникальный

У меня есть массив, который содержит 120 элементов, состоит из дублей, например:

myArray = [0]= item_1, [1] = item _1, [2] = item_2, [3] = item_3 ect.. 

Вкратце им пытается сделать флэш PHP pokermachine, но мне нужно эти элементы в массиве должны быть перемешиваются нО Я не хочу дубликаты быть рядом друг с другом после перетасовки, но мне нужен дубликаты быть еще в массиве

Я не могу выполнить функцию цикла, чтобы проверить это AUSE это изменит перетасовать слишком много раз, которым будет влиять на шансы игры: ниже того, что я в настоящее время:

/* Убрана ссылка здесь, что больше не доступен */

вы можете заметить на раз он удваивается с 2 пунктами в одной рулоне. В основном я динамически создавал виртуальную катушку с файлом php.ini Эти значения неоднократно вставляются в массив ($ virtualreel), поэтому значение может появляться 10 раз в барабане, а другое значение будет отображаться в 5 раз, изменяя odds.Than после того, как я возьму случайный срез() из $ virtualreel, чтобы отобразить 3 vars из этой катушки и повторить цикл еще 4 раз для других барабанов, также я могу только перетасовать один раз, когда хочу срез() должен быть от одного и того же барабанного массива порядка

Я только перетасовываю каждое новое вращение, не выполняющее функции цикла, чтобы перетасовать, если я удвожусь на срезе (массив, 3 элемента).

Надежда iv объяснила, что им после достаточно хорошо, чтобы дать вам, ребята, идею.

ответ

1

Вы можете использовать эту функцию:

<?php 

function shuffleArray($myArray) { 
    $value_count = array_count_values($myArray); 
    foreach($value_count as $key=>$value) { 
     if ($value > count($myArray)/2) { 
      return false; 
     } 
    } 
    $last_value = $myArray[count($myArray) - 1]; 
    unset($myArray[count($myArray) - 1]); 
    $shuffle = array(); 
    $last = false; 
    while (count($myArray) > 0) { 
    $keys = array_keys($myArray); 
    $i = round(rand(0, count($keys) - 1)); 
    while ($last === $myArray[$keys[$i]]) { 
     $i = round(rand(0, count($keys) - 1)); 
    } 
    $shuffle[] = $myArray[$keys[$i]]; 
    $last = $myArray[$keys[$i]]; 
    unset($myArray[$keys[$i]]); 
    } 

    if ($last_value === $last) { 
    $i = 0; 
    foreach($shuffle as $key=>$value) { 
     if ($value !== $last_value) { 
      $i = $key; 
      break; 
     } 
    } 
    array_splice($shuffle, $i + 1, 0, $last_value); 
    } else { 
    $shuffle[] = $last_value; 
    } 

    return $shuffle; 
} 

print_r(shuffleArray(array(1,5,5,3,7,7))); 
+0

Благодарим вас за ответ, он хорошо работает с вашим примером. Я попытаюсь включить этот метод в свой собственный проект. Спасибо за решение этой проблемы. – joshua

+0

ОК, я использовал ваш метод с успехом, НО сценарий тихий, время от времени, и в обычное время ничего не показывает. возможно, они могли бы стать более практичным решением для достижения этого решения. – joshua

+0

Можете ли вы привести пример значений $ myArray, чтобы проверить его. – botzko

1

Почему не просто:

Edit:

$shuffled = array(); 
while(count($to_shuffle) > 0): 
    $i = rand(0, count($to_shuffle)-1); 
    $shuffled[] = $to_shuffle[$i]; 
    array_splice($to_shuffle, $i, 1,null);     
endwhile; 

Я думаю, что это то, что вы ожидали, если вы не возражаете, не сохраняя связь между ключами и значениями.