试图在PHP中重现一些JavaScript代码,变量覆盖问题,如何

Trying to reproduce some JavaScript code in PHP, variable overwrite issue, how to?

本文关键字:代码 JavaScript 变量 覆盖 如何 问题 PHP      更新时间:2023-09-26

我正试图在php中重现一些js代码。我不知道为什么我没有得到同样的结果。我认为js超过了php没有的一些变量(更确切地说是longitudeRange and latitudeRange)。

php $range与js CCD_。

有什么想法吗?

resp = encodeGeohash([34.2360444, -118.5284408]);
alert(resp);
function encodeGeohash (location) {
  var g_BASE32 = "0123456789bcdefghjkmnpqrstuvwxyz";
  var precision = 10;
  var latitudeRange = {
    min: -90,
    max: 90
  };
  var longitudeRange = {
    min: -180,
    max: 180
  };
  var hash = "";
  var hashVal = 0;
  var bits = 0;
  var even = 1;
  while (hash.length < precision) {
    var val = even ? location[1] : location[0];
    var range = even ? longitudeRange : latitudeRange;
    var mid = (range.min + range.max) / 2;
    if (val > mid) {
      hashVal = (hashVal << 1) + 1;
      range.min = mid;
    } else {
      hashVal = (hashVal << 1) + 0;
      range.max = mid;
    }
    even = !even;
    if (bits < 4) {
      bits++;
    } else {
      bits = 0;
      hash += g_BASE32[hashVal];
      hashVal = 0;
    }
  }
  return hash;
};

php代码:

function geoHash($location)
{
    $g_BASE32       = "0123456789bcdefghjkmnpqrstuvwxyz";
    $precision      = 10;
    $latitudeRange  = ['min' => -90, 'max' => 90];
    $longitudeRange = ['min' => -180, 'max' => 180];
    $hash           = "";
    $hashVal        = 0;
    $bits           = 0;
    $even           = 1;
    while (strlen($hash) < $precision) {
        $val   = $even ? $location[1] : $location[0];
        $range = $even ? $longitudeRange : $latitudeRange;
        $mid   = ($range['min'] + $range['max']) / 2;
        var_dump($range);
        if ($val > $mid) {
            $hashVal      = ($hashVal << 1) + 1;
            $range['min'] = $mid;
        } else {
            $hashVal      = ($hashVal << 1) + 0;
            $range['max'] = $mid;
        }
        $even = !$even;
        if ($bits < 4) {
            $bits++;
        } else {
            $bits = 0;
            $hash .= $g_BASE32[$hashVal];
            $hashVal = 0;
        }
    }
    var_dump($hash);
    return $hash;
}
geoHash([34.2360444, -118.5284408]);

分配时

var range = even ? longitudeRange : latitudeRange;

在javascript中,range引用一个对象。所以,当你以后分配时

range.min = mid;

它实际上改变了CCD_ 4或CCD_
相反,您的php代码在该位置使用一个数组,该数组使用写时复制,即当您分配$range['min'] = $mid;时,它既不会影响$latitudeRange也不会影响$longitudeRange
您可以使用对象

<?php
function geoHash($location)
{
    $g_BASE32       = "0123456789bcdefghjkmnpqrstuvwxyz";
    $precision      = 10;
    $latitudeRange  = (object)['min' => -90, 'max' => 90];
    $longitudeRange = (object)['min' => -180, 'max' => 180];
    $hash           = "";
    $hashVal        = 0;
    $bits           = 0;
    $even           = 1;
    while (strlen($hash) < $precision) {
        $val   = $even ? $location[1] : $location[0];
        $range = $even ? $longitudeRange : $latitudeRange;
        $mid   = ($range->min + $range->max) / 2;
        if ($val > $mid) {
            $hashVal      = ($hashVal << 1) + 1;
            $range->min = $mid;
        } else {
            $hashVal      = ($hashVal << 1) + 0;
            $range->max = $mid;
        }
        $even = !$even;
        if ($bits < 4) {
            $bits++;
        } else {
            $bits = 0;
            $hash .= $g_BASE32[$hashVal];
            $hashVal = 0;
        }
    }
    return $hash;
}
var_dump(geoHash([34.2360444, -118.5284408]));

或者篡改php中的引用。