php rand в цикле while

225
11 ноября 2017, 14:07

Есть такой кусочек кода:

$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. Подскажите, есть ли более простой способ сделать задуманное?

Answer 1

Один из вариантов не повторяющихся рандомных значений можно построить таким образом

<?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));
}
READ ALSO
Текущая дата в 24-х форматном поясе

Текущая дата в 24-х форматном поясе

Хочу получить текущую дату, но в формате 24 часов, а не 12

215
Один материал в нескольких категориях

Один материал в нескольких категориях

Подскажите как лучше спроектировать БД для новостей в которой может быть несколько категорий

165