它很容易....讓我猜你的開發系統是Windows,你的生產服務器是Linux?
你有整數溢出問題,因爲大多數LIKEY您的Windows版本的PHP是32位,而Linux是64位
See Condition for array key conversion
- 包含有效整數的字符串將被強制轉換爲整數類型。例如。鍵「8」實際上將被存儲在8以下。另一方面,「08」不會被轉換,因爲它不是有效的十進制整數。
- 浮點數也被轉換爲整數,這意味着小數部分將被截斷。例如。鍵8.7實際上將被存儲在8以下。
- Bools也被轉換爲整數,也就是說,關鍵字true將被實際存儲在1以下並且關鍵字false被置於0以下。
- Null將被轉換爲空字符串,即密鑰null實際上將被存儲在「」之下。 數組和對象不能用作鍵。這樣做會導致警告:非法偏移類型。
所以會發生什麼是:
所以關鍵28000000000000003
是一個64bit
有效integer
但32bits
系統
I was able to replicate your issue
echo "<pre>";
$data = array("28000000000000003" => 'ABC',"28000000000000001" => 'PQR');
$keys = array("28000000000000003","28000000000000001");
$keysDerived = array_keys($data);
var_dump(in_array("28000000000000003", $keysDerived, true));
var_dump(in_array("28000000000000003", $keysDerived));
var_dump(in_array("28000000000000003", $keys, true));
var_dump(in_array("28000000000000003", $keys));
Output
上
String
bool(false) <----------------------- false instead of true
bool(true)
bool(true)
bool(true)
這個問題有沒有關係in_array
而是array_keys
例如
Sample Code
echo "<pre>";
$data = array("28000000000000003" => 'ABC',"28000000000000001" => 'PQR');
$keys = array("28000000000000003","28000000000000001");
$keysDerived = array_keys($data);
var_dump($keys,$keysDerived);
Output
array(2) {
[0]=>
string(17) "28000000000000003" <------- Keys are String
[1]=>
string(17) "28000000000000001"
}
array(2) {
[0]=>
int(28000000000000003) <------- They are converted to int on 64bits
[1]=>
int(28000000000000001)
}
See Online Demo
這意味着他們不是同一類型...
in_array布爾in_array(混合$針,數組$草堆[,布爾$嚴格= FALSE])
如果第三個參數嚴格設置爲TRUE則in_array()函數將還請檢查乾草堆中針的類型。
If you run this code
foreach ($keys as $key) {
echo gettype($key) . "\n";
}
foreach ($keysDerived as $key) {
echo gettype($key) . "\n";
}
Output 64bits的
string
string
integer
integer
輸出32位
string
string
string
string
Simple Workaround
echo "<pre>";
$data = array("28000000000000003" => 'ABC',"28000000000000001" => 'PQR');
$keys = array("28000000000000003","28000000000000001");
$keysDerived = array_keys_string($data);
var_dump($keys,$keysDerived);
var_dump(in_array("28000000000000003", $keysDerived, true));
var_dump(in_array("28000000000000003", $keysDerived));
var_dump(in_array("28000000000000003", $keys, true));
var_dump(in_array("28000000000000003", $keys));
Output
array(2) {
[0]=>
string(17) "28000000000000003"
[1]=>
string(17) "28000000000000001"
}
array(2) {
[0]=>
string(17) "28000000000000003"
[1]=>
string(17) "28000000000000001"
}
bool(true)
bool(true)
bool(true)
bool(true)
See Original Code See Modified Code
功能用於
function array_keys_string(array $input) {
$list = array();
foreach ($input as $k => $v) {
$list[] = (string)$k;
}
return $list;
}
你絕對清楚的是,這些都是字符串? – jeroenvisser101 2013-02-11 12:07:58
沒有任何意義。 – Shoe 2013-02-11 12:08:08
如果這個數字是*不是*字符串,但是整數將會給出不同的結果 – 2013-02-11 12:09:34