Рандомизация строк и массивов с привязкой к определенному параметру

Бывает что нужно рандомизировать массив либо строку, но при этом сделать этот рандом неизменяемым. Например, есть у нас тайтлы страниц, и слова в них нужно подставить рандомные, но так, чтобы при последующих запросах тайтл не менялся. К примеру с привязкой к какому либо уникальному id, либо url, это и будет наш параметр для рандомизации. Напишем функцию, рандомизирующую как массивы, так и строки через указываемый разделитель, и возвращающую результат, либо в виде 1 рандомного элемента, либо весь рандомизированный массив. В параметр для рандомизации, к которому она будет приязана, передадим любую строку или число. Принцип в том, что из параметра будет вычислен md5 хеш, который остается неизменным, символы хеша помещаются в массив с ключами из значений входящего массива. Далее массив сортируется и готово!

<?php

function randomizer ($str_or_arr, $param, $return_arr = false, $delimiter = ',') {
    $arr_str = is_array($str_or_arr) ? $str_or_arr : explode($delimiter, $str_or_arr);
    $arr_str = array_unique(array_filter(array_map('trim', $arr_str)));
    $md5_arr = preg_split('//ui', md5($param), -1, PREG_SPLIT_NO_EMPTY);
    $arr = array_combine($arr_str, array_slice($md5_arr, 0, count($arr_str)));
    asort($arr);
    $result = array_keys($arr);
    return $return_arr ? $result : $result[0];
}

var_dump(randomizer('1 str, 2 str, 3 str, 4 str, 5 str, 6 str, 7 str, 8 str, 9 str, 10 str', 'any string or int number'));
var_dump(randomizer(['1 str', '2 str', '3 str', '4 str', '5 str', '6 str', '7 str', '8 str', '9 str', '10 str'], 'any param', true));

 

Оставить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *