2529


言語は何でも良いのですが、一応PHPにしておきます。

日が変わるごとに配列の順序がランダムに変わるようにしたい場合どのようにやるのが良さそうか教えてください。

私が考えたのは、keyと日付によってhash値を生成し、そのhash値をキーとしてソートすることです。

[code]

    function random_sort_day_by_day($arr){
        $today = strtotime('today');
        $hash_table = array();
        foreach($arr as $key => $val){
            $hashkey = md5($key . $today);
            $hash_table[$hashkey] = $key;
        }
        ksort($hash_table);
        $result = array();
        foreach ($hash_table as $arr_key) {
            $result[] = $arr[$arr_key];
        }
        return $result;
    }
    
[/code]

もっと良い方法あります？


CC BY-SA 3.0
2014-12-25T03:23:37.653
2524
2014-12-25T17:42:14.617
2772
question
php
日毎でランダムな順序の配列を作成する


こういう質問じゃない気もしますが、乱暴にやって良いなら。。

[code]

    $arr = array(1,2,3,4,5);
    srand(date("Ymd"));
    shuffle($arr);
    
    print_r($arr);
    
[/code]

とかでしょうか。


CC BY-SA 3.0
2014-12-25T03:36:10.700
2529
2014-12-25T03:36:10.700
2992
2524
answer


[@ohga](https://ja.stackoverflow.com/users/2992/ohga)さんの派生ですが、更新されるタイミングを
`00:00` 以外に設定したい場合には以下のような実装も考えられます。

[Qiita -
array_rand関数の結果を日付ごとに一意に固定する](http://qiita.com/mpyw/items/ab6e2cf5f64b8a9f3344)

こちらを少し書き換えて

[code]

    function daily_shuffle(array &$array, $at = '00:00') {
        $timezone = new DateTimeZone('Asia/Tokyo');
        $interval = new DateInterval((new DateTime($at, $timezone))->format('\P\TH\Hi\Ms\S'));
        $datetime = new DateTime('now', $timezone);
        srand($datetime->sub($interval)->format('Ymd'));
        shuffle($array);
        srand(); // これを忘れない！
    }
    
[/code]

**※ 他の場所に影響を及ぼすので、最後には必ずシードを現在時間依存のものにリセットするようにしてください**


CC BY-SA 3.0
2014-12-25T17:42:14.617
2594
2014-12-25T17:42:14.617
2017-04-13T12:52:39.113
-1
940
2524
answer