Есть такой кусочек кода:
$repeat = 1;
while ($repeat == 1) {
$temprand = rand(0, $vidc);
if (!in_array($temprand, $vid)) {
if ($temprand != 0) {
echo $temprand;
$repeat = 0;
} else {
$ttt = rand(0, $vidc);
if ($ttt == 0) {
echo "Ended";
$repeat = 0;
}
}
}
};
Где $vidc = 3.
А $vid равен массиву (1) или (1, 2), или (1, 3) или (1, 2, 3)
Его цель - генерировать случайное число от 1 до 3 так, чтобы не было повторений. То есть если выпадает 1, второй раз 1 выпасть не может. 0 используется для закрытия цикла, при выпадании 0 два раза цикл обрывается. Умнее ничего не придумал... Из-за этого, цикл может отработать 1, 2 и пропустить 3, или отработать 1, и пропустить 2, 3. Подскажите, есть ли более простой способ сделать задуманное?
Один из вариантов не повторяющихся рандомных значений можно построить таким образом
<?php
session_start();
if (!isset($_SESSION['arr']) && !isset($_SESSION['bool'])) {
$_SESSION['arr'] = range(1, 10);
}
$arr = &$_SESSION['arr'];
if (is_array($arr)) {
$key = array_rand($arr);
echo $arr[$key];
unset($arr[$key]);
}
if (count($_SESSION['arr']) < 1) {
unset($_SESSION['arr']);
$_SESSION['bool'] = true;
}
UPD: Дописал вариант без использования сессий
$file = 'numbers.txt';
$numbers = file_exists($file)
? file($file, FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES)
: range(1, 10);
if (!empty($numbers)) {
shuffle($numbers);
echo $numbers[0];
unset($numbers[0]);
file_put_contents($file, join(PHP_EOL, $numbers));
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Подскажите как лучше спроектировать БД для новостей в которой может быть несколько категорий