Получение двойных чисел из array_rand

1

Я хочу создать скрипт Bingo. Я уже закодировал шаблон 6x6 со случайными числами, которые имеют определенный диапазон в каждой строке. НО теперь он выводит одно и то же число несколько раз, я хочу, чтобы это были случайные числа, может кто-нибудь помочь мне?

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<title>Indzendopdracht 051R3</title>
</head>

<body>
<?PHP

function printBingocard(){

$bingoNumbers = array(
"rij_1" => array(10,11,12,13,14,15,16,17,18,19),
"rij_2" => array(20,21,22,23,24,25,26,27,28,29),
"rij_3" => array(30,31,32,33,34,35,36,37,38,39),
"rij_4" => array(40,41,42,43,44,45,46,47,48,49),
"rij_5" => array(50,51,52,53,54,55,56,57,58,59),
"rij_6" => array(60,61,62,63,64,65,66,67,68,69)
);



$rand_keys = array_rand($bingoNumbers, 1);  
$rows = array();


foreach($bingoNumbers["rij_1"] as $bn_rij1){
    if($bn_rij1 > 10 && $bn_rij1 <= 16){
      $rows["row1"][]="<td>" . $bingoNumbers["rij_1"][array_rand($bingoNumbers["rij_1"])] ."</td>";
    }
}
foreach($bingoNumbers["rij_2"] as $bn_rij2){
    if($bn_rij2 > 20 && $bn_rij2 <= 26){
      $rows["row2"][]="<td>" . $bingoNumbers["rij_2"][array_rand($bingoNumbers["rij_2"])] ."</td>";
    }
}
foreach($bingoNumbers["rij_3"] as $bn_rij3){
    if($bn_rij3 > 30 && $bn_rij3 <= 36){
      $rows["row3"][]="<td>" . $bingoNumbers["rij_3"][array_rand($bingoNumbers["rij_3"])] ."</td>";
    }
}
foreach($bingoNumbers["rij_4"] as $bn_rij4){
    if($bn_rij4 > 40 && $bn_rij4 <= 46){
      $rows["row4"][]="<td>" . $bingoNumbers["rij_4"][array_rand($bingoNumbers["rij_4"])] ."</td>";
    }
}
foreach($bingoNumbers["rij_5"] as $bn_rij5){
    if($bn_rij5 > 50 && $bn_rij5 <= 56){
      $rows["row5"][]="<td>" . $bingoNumbers["rij_5"][array_rand($bingoNumbers["rij_5"])] ."</td>";
    }
}
foreach($bingoNumbers["rij_6"] as $bn_rij6){
    if($bn_rij6 > 60 && $bn_rij6 <= 66){
      $rows["row6"][]="<td>" . $bingoNumbers["rij_6"][array_rand($bingoNumbers["rij_6"])] ."</td>";
    }
}


echo "<table>";
foreach($rows as $row){
    echo "<tr>";
    foreach($row as $r){
        echo $r;
    }
    echo "</tr>";
}
echo "</table>";
}//END OF FUNCTION


printBingocard();
?>
</body>
</html>
  • 0
    Ваш код должен просто напечатать случайную таблицу из вашего массива, но не с повторяющимися числами?
  • 0
    Да, когда он выводит, например, 10 - 20, я не хочу, чтобы у него были дубликаты.
Теги:
arrays

1 ответ

3
Лучший ответ

Почему бы просто не использовать shuffle()? Как сейчас, вы никогда не проверяете, что array_rand() создает дублирующее число, так что да, вы обманываете.

Это намного эффективнее:

foreach(array_keys($bingoNumbers) as $key) {
    shuffle($bingoNumbers[$key]);
}

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

$bingoNumbers = array(
	"rij_1" => array(10,11,12,13,14,15,16,17,18,19),
	"rij_2" => array(20,21,22,23,24,25,26,27,28,29),
	"rij_3" => array(30,31,32,33,34,35,36,37,38,39),
	"rij_4" => array(40,41,42,43,44,45,46,47,48,49),
	"rij_5" => array(50,51,52,53,54,55,56,57,58,59),
	"rij_6" => array(60,61,62,63,64,65,66,67,68,69)
);
	
foreach(array_keys($bingoNumbers) as $key)
	shuffle($bingoNumbers[$key]);
			
echo "<table border='1'>";
foreach($bingoNumbers as $v)
	echo "<tr><td>" . implode("</td><td>", $v) . "</td></tr>";
echo "</table>";

Demo

Если вам нужна только сетка 6x6, просто array_slice() ваши вспомогательные массивы, например

$bingoNumbers = array(
	"rij_1" => array(10,11,12,13,14,15,16,17,18,19),
	"rij_2" => array(20,21,22,23,24,25,26,27,28,29),
	"rij_3" => array(30,31,32,33,34,35,36,37,38,39),
	"rij_4" => array(40,41,42,43,44,45,46,47,48,49),
	"rij_5" => array(50,51,52,53,54,55,56,57,58,59),
	"rij_6" => array(60,61,62,63,64,65,66,67,68,69)
);
	
foreach(array_keys($bingoNumbers) as $key)
	shuffle($bingoNumbers[$key]);
			
echo "<table border='1'>";
foreach($bingoNumbers as $v)
	echo "<tr><td>" . implode("</td><td>", array_slice($v, 0, 6)) . "</td></tr>";
                                             //^^^^^^^^^^^^ Just slice your sub array
echo "</table>";

Demo

  • 0
    Так что я должен заменить все циклы foreach на код, который вы предоставили? Я только что сделал это, но это дает мне эту ошибку: Неустранимая ошибка: вызов неопределенной функции array_shuffle () в каталоге C: \ в строке 28
  • 1
    @Ixecube Я думаю, что это была просто опечатка от Marc B, просто измените array_shuffle() на shuffle() и его код работает отлично
Показать ещё 10 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню