如何用PHP弄清楚gematria总数?

时间:2016-11-20 13:44:40

标签: php arrays

我正在尝试创建一个计算gematria的PHP应用程序。 Gematria是一种将文字转化为数字的秘密语言。我用它来处理没有重复字母的单词。

有效的词语:

  • 特斯拉
  • ABCDE

不起作用的词语:

  • aaa(有多个a)
  • monsanto(有2个月)

  /**
  * English Gematria Values
  *
  * @return array $array An array of key value pairs
  */

  function english_values() {
    $values = array(
      'a' => 6,
      'b' => 12,
      'c' => 18,
      'd' => 24,
      'e' => 30,
      'f' => 36,
      'g' => 42,
      'h' => 48,
      'i' => 54,
      'j' => 60,
      'k' => 66,
      'l' => 72,
      'm' => 78,
      'n' => 84,
      'o' => 90,
      'p' => 96,
      'q' => 102,
      'r' => 108,
      's' => 114,
      't' => 120,
      'u' => 126,
      'v' => 132,
      'w' => 138,
      'x' => 144,
      'y' => 150,
      'z' => 156,
    );
    return $values;
  }


  function calculator( $word ) {
    $split   = array_flip( str_split( $word ) );
    $english = array_intersect_key( english_values(), $split ); 
    return $english; 
  }

  print_r( calculator( 'tesla ') );
  echo "</br></br>";
  print_r( calculator( 'monsanto ') );

输出结果为:

  

数组([a] =&gt; 6 [e] =&gt; 30 [1] =&gt; 72 [s] =&gt; 114 [t] =&gt; 120)

     

阵列([a] =&gt; 6 [m] =&gt; 78 [n] =&gt; 84 [o] =&gt; 90 [s] =&gt; 114 [t] =&gt; 120)

你可以看到特斯拉能够通过每个字母。但孟山都错过了最后一个o所以我无法计算出正确的总数。

我也希望这些字母按照这个词的顺序排列,以便特斯拉输出:

  

数组([t] =&gt; 120 [e] =&gt; 30 [s] =&gt; 114 [1] =&gt; 72 [a] =&gt; 6)

我可能正在使用错误的PHP函数来处理这个问题,所以我会在正确的方向上给予任何帮助。我有一段时间没有编码所以我有点生疏了。我尝试了多个PHP函数,但这似乎让我最接近我需要做的事情。谢谢。

编辑:我也理解重复字母不显示的原因是因为不能有重复的键。所以我认为我这样做可能相当倒退。

2 个答案:

答案 0 :(得分:0)

希望这会让你前进:

print_r(encodeWord('monsanto'));

function encodeWord($word) {
    for ($i = 0; $i < strlen($word); $i++) {
        $encodedWord[] = [
            'letter' => $word[$i],
            'convertedLetter' => convertLetter($word[$i]),
        ];
    }

    return $encodedWord;
}

function convertLetter($letter) {
    $values = [
        'a' => 6,
        'b' => 12,
        'c' => 18,
        'd' => 24,
        'e' => 30,
        'f' => 36,
        'g' => 42,
        'h' => 48,
        'i' => 54,
        'j' => 60,
        'k' => 66,
        'l' => 72,
        'm' => 78,
        'n' => 84,
        'o' => 90,
        'p' => 96,
        'q' => 102,
        'r' => 108,
        's' => 114,
        't' => 120,
        'u' => 126,
        'v' => 132,
        'w' => 138,
        'x' => 144,
        'y' => 150,
        'z' => 156,
    ];

    return $values[$letter];
}

答案 1 :(得分:0)

对于双字母,似乎您使用的功能将无法看到它们。也许你应该做自己的功能,就像刚回答的那样。

要使字母以与给定单词相同的顺序出现,您只需在array_intersect_key()调用中切换参数即可。所以:

$english = array_intersect_key( $split , english_values() ); 

而不是

$english = array_intersect_key( english_values(), $split );