65692


**やりたいこと**

  * (数が無限にある)任意の文字列に対して、必ず配列内の何れかの値を割り振りたい
  * (後で実行する場合でも)同じ文字列の場合は、必ず同じ色(配列の値)となるようにしたい

$hoge = ['赤','青','黄','緑','黒','白','橙','茶'];

どういう方法がありますか？


CC BY-SA 4.0
2020-04-16T22:53:38.913
65691
2020-04-16T23:44:39.107
7886
question
php
同じ文字列の場合は必ず同じ配列の値となるよう、文字内容に応じて配列の値を割り振りたい


細かい要件がわかりませんが、そのような用途なら`hash`が使えるかもしれません。

[code]

    <?php
        $inputString = "テスト用文字列";
        $hoge = ['赤','青','黄','緑','黒','白','橙','茶'];
    
        //ハッシュ値を求める。今回の用途なら暗号学的に強力なアルゴリズムを使用する必要はない。
        $hashValue = hash('md5', $inputString); //$hashValue = md5($inputString); としても同じ
        //配列のインデックスに使うため整数値に変換
        $hashInt = intval(substr($hashValue, 0, 8), 16);
        //色配列から色を求める
        $color = $hoge[$hashInt % count($hoge)];
        echo $hashValue.':'.$hashInt.':'.$color;
    
[/code]

出力例(エンコーディングがUTF-8の場合):

[code]

    9a15fb2809c058e6842ff1f727bc610b:2585131816:赤
    
[/code]

入力文字列をバイト列としてハッシュ値を求めるので、結果はエンコーディングに依存しますが、同一エンコーディングならどんな環境で何回実行しても必ず同じ結果になるはずです。


CC BY-SA 4.0
2020-04-16T23:44:30.283
65692
2020-04-16T23:44:30.283
13972
65691
answer


典型的
[ハッシュ関数](https://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E9%96%A2%E6%95%B0)
ですね。

  * ある任意の入力があるとき（この例では文字列）
  * なんらかの変換関数によって有限個の数値を得る（この例では `[0, 8)` の整数）

変換関数の性質として

  * 同じ入力に対しては同じ値が得られる
  * 出力される値はどれもほぼ均等になる

のが望ましいとされています。

文字列を何らかの方法で数値 `value` に変換し `value%個数` でも立派なハッシュ関数です（性能が良いかどうかは別問題として）


CC BY-SA 4.0
2020-04-16T23:44:39.107
65693
2020-04-16T23:44:39.107
8589
65691
answer