0

編集: 私は自分の問題のデモを作成しました: http://codepad.org/ByNdAdCI

次のロジックを使用して、32 ビット PHP で配列を設定します。

    private function formatAvailableOptions($availableOptions) {
    $optionsAsArray = array();
    foreach($availableOptions as $option){
        $optionsAsArray[$option["entity_id"]] = $option["name"];
    }
    return $optionsAsArray;
}

問題:

  1. $option["entity_id"]が大きくなりすぎて 32 ビット int に収まらず、その結果、作成時にオーバーフローします$optionsAsArray。例えば

    $optionsAsArray[2147483648] = "こんにちは";

になる

$optionsAsArray[-2147483648] = "hi";

データベースのIDに関連付けられているため、インデックスを2147483648にする必要があります

  1. このコードはすでにクライアントに出荷されており、ロジックは多くの場所で使用されているため、すべてのインスタンスを変更することは不可能です。

    $optionsAsArray[strVal(2147483648)] = "hi";

文字列型を連想配列のキーとして使用することで、正しく実行できるようにします。

この場合の最善の解決策は何ですか? この問題を回避するために、すべての php 配列が文字列をキーとして使用するように強制するためのグローバル設定オプションはありますか?

4

1 に答える 1

1

float がキーとして気に入らないようです ;) したがって、float への型キャストは失敗します。質問で解決策について既に言及しました(strVal($var)、または(string) $var、または単に"$var")。顧客が 64 ビットで PHP を実行している場合 (そうすべきです ;))、違いはわかりません。これは明らかにバグであるため、修正して顧客に更新を公開することを検討する必要があります。32 ビット インストールをその場で 64 ビット インストールに変換するオプションまたは設定はありません。

于 2012-06-14T18:07:24.970 に答える