非常容易....让我猜测一下,你的开发系统是Windows,而你的生产服务器是Linux?
你遇到整数溢出问题,因为你的PHP Windows版本很可能是32位的,而Linux是64位的。
查看数组键转换的条件
- 包含有效整数的字符串将被转换为整数类型。例如,键"8"实际上将存储在8下。另一方面,"08"不会被转换,因为它不是有效的十进制整数。
- 浮点数也会被转换为整数,这意味着小数部分将被截断。例如,键8.7实际上将存储在8下。
- 布尔值也会被转换为整数,即键true实际上将存储在1下,键false存储在0下。
- null将被转换为空字符串,即键null实际上将存储在""下。不能使用数组和对象作为键。这样做会导致警告:非法的偏移类型。
所以发生的情况是:
因此,关键字28000000000000003
在64位
系统上是有效的整数
,但在32位
系统上是一个字符串
我能够复制您的问题
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));
输出
bool(false) <----------------------- false instead of true
bool(true)
bool(true)
bool(true)
这个问题与
in_array
无关,而是与
array_keys
示例有关。
示例代码
echo "<pre>";
$data = array("28000000000000003" => 'ABC',"28000000000000001" => 'PQR');
$keys = array("28000000000000003","28000000000000001");
$keysDerived = array_keys($data);
var_dump($keys,$keysDerived);
输出
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)
}
查看在线演示
这意味着它们不是同一类型...
in_array bool in_array ( mixed $needle , array $haystack [, bool $strict = FALSE ] )
如果第三个参数strict设置为TRUE,则in_array()函数还将检查在haystack中的needle的类型。
如果您运行此代码
foreach ( $keys as $key ) {
echo gettype($key) . "\n";
}
foreach ( $keysDerived as $key ) {
echo gettype($key) . "\n";
}
输出 64位
string
string
integer
integer
输出 32 位
string
string
string
string
简单解决方案
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));
输出
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)
查看原始代码
查看修改后的代码
使用的函数
function array_keys_string(array $input) {
$list = array();
foreach ( $input as $k => $v ) {
$list[] = (string)$k;
}
return $list;
}
array_map('var_dump', array_keys($data));
- nice ass