とても簡単です....開発システムはWindowsで、本番サーバーはLinuxだと思いますか?
ほとんどの場合、WindowsバージョンのPHPは32ビットであり、Linuxは64ビットであるため、整数オーバーフローの問題が発生しています。
配列キー変換の条件を参照してください
- 有効な整数を含む文字列は、整数型にキャストされます。たとえば、キー「8」は実際には8の下に格納されます。一方、「08」は有効な10進整数ではないため、キャストされません。
- フロートも整数にキャストされます。これは、小数部分が切り捨てられることを意味します。たとえば、キー8.7は実際には8の下に保存されます。
- Boolも整数にキャストされます。つまり、キー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(mixed $needle、array $ haystack [、bool $ strict = FALSE])
3番目のパラメーターstrictがTRUEに設定されている場合、in_array()関数は干し草の山にある針のタイプもチェックします。
このコードを実行すると
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;
}