试图在 PHP 中重现一些 JavaScript 代码,变量覆盖问题,如何?
Trying to reproduce some JavaScript code in PHP, variable overwrite issue, how to?
我正在尝试在 php 中重现一些 js 代码。我不确定为什么我没有得到相同的结果。我认为 js 过度使用了 php 没有的一些变量(longitudeRange and latitudeRange
更准确)。
php $range
与 js range
.
的结果不同
有什么想法吗?
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.min = mid;
它实际上更改了 longitudeRange
或 latitudeRange
引用的对象之一的 属性。
相比之下,您的 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]));
或fiddle与references in php。
我正在尝试在 php 中重现一些 js 代码。我不确定为什么我没有得到相同的结果。我认为 js 过度使用了 php 没有的一些变量(longitudeRange and latitudeRange
更准确)。
php $range
与 js range
.
有什么想法吗?
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.min = mid;
它实际上更改了 longitudeRange
或 latitudeRange
引用的对象之一的 属性。
相比之下,您的 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]));
或fiddle与references in php。