作者tn801534 (踢恩)
看板PHP
标题Re: [请益] 诡异的array key问题
时间Tue Jun 7 15:49:15 2011
我自问自答
http://bugs.php.net/bug.php?id=34879
修正程式码如下
http://0rz.tw/HaIDQ
http://0rz.tw/k3gzX
重编php後於64bit机器已正常~~~
原因为php於array相关函数操作时将ulong丢入uint造成~~~
※ 引述《roga (任性)》之铭言:
: ※ 引述《tn801534 (踢恩)》之铭言:
: : 我发现我把问题点搞错了
: : 重新附上code如下
: : --------------------------------------------
: : $test["9911815002"]=1;
: : $test["9911815003"]=2;
: : $temp_RS = array_chunk($test, 1, true);
: : print_r($temp_RS);
: : echo PHP_INT_MAX;
: : ===================================================
: : 我发现於有问题的主机上印出的结果竟然是
: : Array ( [0] => Array ( [1321880410] => 1 ) [1] => Array ( [1321880411] => 2 )
: : ) 9223372036854775807
: 64bit 跑出来的结果?
: 是的话这台有问题,唯一解法大概是软体升一下 or 重新编译看看.. orz
: : 但预期的结果应该是
: : Array ( [0] => Array ( [9911815002] => 1 ) [1] => Array ( [9911815003] => 2 )
: : ) 2147483647
: : 我查看原本/usr/local/include/php/main/php.h内的定义两台主机都是如下~
: 要先看编译时有没有 limit.h
: 有的话,limit.h 里面定义的比 php.h 定义的更为优先
: : #ifndef INT_MAX
: : #define INT_MAX 2147483647
: : #endif
: : 感觉上是主机上没有将超过INT_MAX的数字转为字串,因为INT_MAX定义错了?
: 其实看 INT_MAX 是不对的,要看 LONG_MAX , PHP 内部整数的最大值 (PHP_INT_MAX)
: 其实是来自於系统的 LONG_MAX 。这个常数在 php 的 main.c 里面有宣告:
: REGISTER_MAIN_LONG_CONSTANT("PHP_INT_MAX", LONG_MAX, CONST_PERSISTENT | CONST_CS);
: 但这真的很容易混淆,因为 32bit 的 INT_MAX 和 LONG_MAX 是一样的。
: 我原本偷偷在猜是不是你 32bit 那台是烂的,但看这个结果,是 64bit 这台烂了...
: array_chunk 的确会影响整数的精确度,但你没有超过 64bit 的 PHP_INT_MAX
: 所以也很奇怪...orz
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 211.20.224.10