2016-12-05 225 views
1

任何人都可以帮助我将此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));

我想这个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数字是6 4位浮点值,按位运算符(如位移和位),或者对32位整数进行操作。这就是为什么32位整数溢出发生在你的JS函数中,但在PHP函数中,这不会发生。

解决方法:您需要模拟PHP函数中的整数溢出,以实现与JS相同的输出。这已经在this answer中完成了另一个问题。 该函数需要应用于每个二元运算符。在你的情况下,<<&(在你的js函数中看起来像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); 
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); 
+0

你是否发布这个作为你自己的问题的答案?我不认为这会和你的js功能产生同样的结果。也许你想编辑你的问题? –