Ответ 1
Его очень легко.... позвольте мне угадать, что ваша система разработки - это окна, а ваш производственный сервер - Linux?
У вас есть проблемы с переполнением Integer, потому что большинство пользователей вашей версии Windows PHP 32bit, а linux - 64bit
См. Условие для преобразования ключа массива
- Строки, содержащие действительные целые числа, будут отлиты от целочисленного типа. Например. ключ "8" будет фактически сохранен под 8. С другой стороны, "08" не будет выбрано, так как оно не является допустимым десятичным целым.
- Поплавки также отливаются от целых чисел, что означает, что дробная часть будет усечена. Например. ключ 8.7 будет фактически сохранен под 8.
- Bools также передаются в целые числа, т.е. ключ true будет фактически сохранен под 1 и ключ false под 0.
- Null будет передан в пустую строку, т.е. нулевой ключ будет фактически сохранен под "". Массивы и объекты не могут использоваться в качестве ключей. Это приведет к предупреждению: тип недопустимого смещения.
Итак, что происходит, это:
Таким образом, ключ 28000000000000003
является допустимым integer
в 64bit
, но a 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
example
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 (смешанная $игла, массив $haystack [, bool $strict = FALSE])
Если для третьего параметра Строго установлено значение ИСТИНА, то функция in_array() также проверит типы иглы в стоге сена.
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;
}