Случайный выбор

921
.
# dilp (31.05.2017 / 01:39)
Меня смущает применение сессии, её ведь можно как-то подделать и повлиять на выборку?
Нет, недостаток только в том, что если закрыть браузер, то данные в сессии обнулятся. Поэтому лучше заменить сессии на базу данных или текстовый файл (если описанная причина не желательна).
.

Почему нельзя заменить на глобальную переменную?

.
# dilp (31.05.2017 / 01:52)
Почему нельзя заменить на глобальную переменную?
Чем глобальная переменная отличается от локальной переменной? -- Допустим, записал ты что-то в $GLOBALS. Запустил скрипт, и в $GLOBALS снова произошла инициализация. Не? А тебе надо, чтобы значение хранилось между запросами, а не инициализировалось при каждом старте скрипта.
.

Да,точно ))
А зачем вообще тут сохранение ?

.
# dilp (31.05.2017 / 01:58)
Да,точно ))
А зачем вообще тут сохранение ?
Ну а циферки в массиве где держать? Они же уменьшаться должны при каждом обращении к скрипту. Вот и выходит, что инициализируем мы массив один раз :

$r = [
    'alfa' => 3,
    'beta' => 9,
    'gamma' => 0,
    'delta' => 6
];

// Сохранили массив
$_SESSION['freak'] = $r;
А все последующие обращения к скрипту мы работаем уже с сессией (рандомно уменьшаем значения массива, пока он не станет пуст -- после снова инициализируем массив и сохраняем в сессию)
.

Получается пока все шарики из мешка не вытащить , новых шариков в мешке не появится. Хм,а у меня динамичный набор величин, а я думаю - почему как-то не так работает.

.
# dilp (31.05.2017 / 02:17)
Получается пока все шарики из мешка не вытащить , новых шариков в мешке не появится. Хм,а у меня динамичный набор величин, а я думаю - почему как-то не так работает.
Если исходный массив у тебя подвержен изменениям, тогда можно добавить условие с проверкой на соответствие массивов - если массивы не равны, перезаписывать сессию.
.
# dilp (31.05.2017 / 02:17)
Хм,а у меня динамичный набор величин...
Вот вариант для динамических массивов:
* (+/-)
/*
Попробуй добавлять/удалять пары 
    'ключ' => число
в исходном массиве $r
*/

session_id() ?: session_start();

$r = [
    'alfa' => 3,
    'beta' => 9,
    'gamma' => 0,
    'delta' => 6
];

echo 'Выбрана картинка с id: '. findRandKey($r);


function findRandKey($r) {
    $m = (empty($_SESSION['m']) ? ($_SESSION['m'] = $r) : $_SESSION['m']);
    $i = (count($r) > count($m) ? array_diff_key($r,$m) : array_diff_key($m,$r));
    empty($i) ?: $_SESSION['freak'] = $_SESSION['m'] = $r;
        
    do {
        if (!empty($_SESSION['freak'])) {
            $a = &$_SESSION['freak'];
            $k = array_rand($a);
            empty($a[$k]) ?: --$a[$k];
 
            if ($a[$k] < 1) {
                unset($a[$k]);
            }
        } else {
            $_SESSION['freak'] = $r;
        }
    } while (empty($k) || empty($a[$k]));
    
    return $k;
}
Всего: 38