将Javascript代码转换为php

时间:2016-12-05 22:26:55

标签: javascript php

任何人都可以帮我将这个javascript函数转换为php吗?



var t='[{"id_page":14,"in_visible":1,"in_insert":1,"in_update":1}]';
function hash (s) {
  return s.split("").reduce(
      function(a, b) {
        return a = (a << 5) - a + b.charCodeAt(0),  a & a  
      }, 0
  ).toString()
}
            
alert(hash(t));
&#13;
&#13;
&#13;

我正在尝试这个PHP脚本:

function fun($a, $b)
{
    return $a = ($a << 5) - $a + ord(substr($b,0,1));//  $a & $a;
}

$v = '[{"id_page":14,"in_visible":1,"in_insert":1,"in_update":1}]';
$a = str_split($v);
$r = array_reduce($a,'fun',0);
print_r($r);

2 个答案:

答案 0 :(得分:1)

您的代码存在问题: 虽然在JS中所有数字都是64位浮点值,但是按位运算符如shift和bit,或者操作32位整数。这就是你的JS函数中发生32位整数溢出的原因,但在PHP函数中这不会发生。

修复它:你需要在PHP函数中模拟整数溢出,以实现与JS相同的输出。已经在this answer中针对不同的问题进行了此操作。 此函数需要应用于每个二元运算符。在您的情况下,{j}函数中的<<&(似乎a & a仅用于从结果中生成32位整数。)

因此返回相同哈希值的PHP函数可能如下所示:

<?php
function intval32bits($value){
    $value = ($value & 0xFFFFFFFF);
    if ($value & 0x80000000)
        $value = -((~$value & 0xFFFFFFFF) + 1);
    return $value;
}

function fun($a, $b){
    return intval32bits(doOverflow32b($a << 5) - $a + ord($b[0]));
}

$v = '[{"id_page":14,"in_visible":1,"in_insert":1,"in_update":1}]';
$a = str_split($v);
$r = array_reduce($a,'fun',0);
print_r($r);

答案 1 :(得分:0)

我得到了

function fun($a, $b)
{
    $a = $a & $a;
    return $a = ($a << 5) - $a + ord(substr($b,0,1));//  $a & $a;
}

$v = '[{"id_page":14,"in_visible":1,"in_insert":1,"in_update":1}]';
$a = str_split($v);
$r = array_reduce($a,'fun',0);
print_r($r);