同じ文字列の場合は必ず同じ配列の値となるよう、文字内容に応じて配列の値を割り振りたい


**やりたいこと**

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

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

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




細かい要件がわかりませんが、そのような用途なら`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]

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




細かい要件がわかりませんが、そのような用途なら`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]

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

