我正在尝试计算一个单词的“得分”,以便它用于确定Redis排序集中的词典顺序(按字母顺序列出的单词)。
阅读this post它说:
如何将单词转换成分数?
例如,如果你想使用前四个字母来产生 得分,这是规则:
得分=第一字节值*(256 ^ 3)+第二字节值*(256 ^ 2)+ 第三字节值*(256 ^ 1)+第四字节值
如果单词是<&lt;&lt;&lt;&lt; 4个字符 长度。
为什么会这样?您只是将字节视为a的数字 radis-256号:)
根据这个理论,我提出了以下代码来测试这是否适用于PHP数组:
$words = array('abcd', 'hello', 'dogs', 'hiya');
$newWords = array();
foreach ($words as $word) {
$len = strlen($word);
if ($len > 4) {
$len = 4;
}
$i = 0;
$j = $len - 1;
$score = 0;
while ($i < $len) {
$byte = ord($word[$i]);
if ($j == 0) {
$score += $byte;
}
else {
$score += $byte * (256 ^ $j);
}
$i++;
$j--;
}
$newWords[$score] = $word;
}
ksort($newWords);
print_r($newWords);
但是这会返回:
Array
(
[75950] => abcd
[80858] => hello
[81124] => dogs
[85220] => hiya
)
不按字母顺序排列。
任何人都可以发现问题(显然分数计算错误)?我可能误解了帖子: - /
答案 0 :(得分:1)
我改进了一些代码并改为使用pow
代替
$words = array('abcd', 'hello', 'dogs', 'hiya');
$newWords = array();
foreach ($words as $word) {
$len = strlen($word);
if ($len > 4) {
$len = 4;
}
$i = 0;
$j = $len - 1;
$score = 0;
while ($i < $len) {
$byte = ord($word[$i]);
$score += $byte * pow(256, $j);
$i++;
$j--;
}
$newWords[$score] = $word;
}
ksort($newWords);
print_r($newWords);
它完全符合您的预期:
Array ( [1633837924] => abcd [1685022579] => dogs [1751477356] => hello [1751742817] => hiya )
你实际上使用了XOR http://www.php.net/manual/en/language.operators.bitwise.php