它很简单....让我猜你的开发系统是windows,你的生产服务器是linux?
您遇到整数溢出问题,因为您的 Windows 版本的 PHP 很可能是 32 位,而 linux 是 64 位
请参阅数组键转换的条件
- 包含有效整数的字符串将被转换为整数类型。例如,键“8”实际上将存储在 8 下。另一方面,“08”不会被强制转换,因为它不是有效的十进制整数。
- 浮点数也被转换为整数,这意味着小数部分将被截断。例如,密钥 8.7 实际上将存储在 8 之下。
- 布尔值也被转换为整数,即键 true 将实际存储在 1 下,而键 false 将存储在 0 下。
- Null 将被强制转换为空字符串,即键 null 将实际存储在 "" 下。数组和对象不能用作键。这样做会导致警告:非法偏移类型。
那么会发生什么:
所以密钥在系统上28000000000000003
是有效integer
的,64bit
但String
在32bits
系统上是有效的
我能够复制您的问题
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 ( 混合 $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";
}
输出64Bits
string
string
integer
integer
输出 32Bits
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;
}