1

キーの値を変更する配列に問題があります。以下に提供する例では、最初は問題ありませんが、ある時点でphpが文字列を整数に変換し、キーとして別の配列に挿入するときにその整数を変更しています。

Code
-----------------
$fund = '01';
$division = '1';
$gl_transactions[$fund] = array();
$glint = array($division=>array('gl_cash_account'=>'1800001040000000')); 
print chr(10).'1:'.chr(10); 
print_r($glint); 
$gl = $glint[$division]['gl_cash_account']; 
print chr(10).'2:'.chr(10); 
print $gl;
$gl_transactions[$fund][$gl]['description'] = 'MTS DISBURSEMENTS'; 
print chr(10).'3:'.chr(10);
print_r($gl_transactions);

Expected output 
--------------- 
1:Array([1] => Array([gl_cash_account] => 1800001040000000 ))
2:1800001040000000  
3:Array([01] => Array([1800001040000000] => Array([description] => MTS DISBURSEMENTS))) 

Actual output 
--------------- 
1:Array([1] => Array([gl_cash_account] => 1800001040000000 ))
2:1800001040000000  
3:Array([01] => Array([1721082880] => Array([description] => MTS DISBURSEMENTS))) 

インデックスが 1800001040000000 から 1721082880 に変更されたことに注意してください

障害物

これらの大きな数字は G/L 口座番号であり、小さな数字に変更することはできません。私たちの製品には何万ものコードがあり、100 万行を超えるコードがありますが、そのすべてを調べて問題の可能性がある場所を見つけて書き直すことはできません。これは、データベースのデータを使用して多次元配列を構築するという、私たちが多くの場所で行っていることの単なる一般的な例です。上記の例を修正するために、配列に挿入するときに変数を文字列として単純にキャストできますが、1M 以上のコード行をバックフィルすることは実行可能なオプションではありません。

私の開発マシンでは、php 5.3 MSSQL、Windows、および IIS を実行しています。上記のコードではこのエラーは発生しませんが、単に変数を整数として設定し、それをキーとして配列に挿入すると発生します。つまり、$gl = 1800001040000000; $ar[$gl] = 1; print_r($ar); 現在、ソフトウェアで変数を整数にキャストしませんが、最初の例では、php は、一部のクライアント システムで実行されたときに、最後の配列を構築している時点で変数を独自に変換します。

だから私の質問は:

  1. 数値配列キーの正確な制限は?
  2. これを増やす方法はありますか?
  3. これは、5.2 以降の php の新しいバージョンで修正または増加されましたか?

その他の注意事項

当社のソフトウェアは、複数のデータベース、複数のブラウザ、window と linux、apache と IIS で動作します。何百人ものお客様が独自のセットアップでソフトウェアを使用しています。現在、ほとんどのお客様は php 5.2 を使用しており、ソフトウェアで使用されている機能が非推奨になっているため、現時点ではアップグレードできません。

4

2 に答える 2

1

私の推測では、PHP は整数の配列キーとして使用される有効な整数値を持つ文字列を自動的にキャストするため、整数の最大値によって制限されていると思います。PHP マニュアルは、整数の制限がシステムによって異なることを示していますが、大きな問題は、上限を決定する際の 32 ビット システムと 64 ビット システムです。

http://php.net/manual/en/language.types.integer.php

PHP_INT_MAXシステムの最大整数値は定数から読み取ることができます。

于 2013-07-31T00:45:25.983 に答える
1

ここには受け入れられた答えがないようです。確かに、OPはこれから移行しました。次のような配列でキーを失っていました(Snowmed CTから):

static function getNemsisProcedures() {
  $nemsis[445828009] = 'Assessment  Advanced Spinal Assessment (i.e.,  spinal clearance)';
  $nemsis[425058005] = 'Assessment  Orthostatic Vital Signs';
  // etc....
  $nemsis[89666000] = 'Cardiac  CPR, Manual';
  $nemsis[450661000124102] = 'Cardiac  Defibrillation, AED'; // TAKE NOTE
  $nemsis[426220008] = 'Cardiac  Defibrillation, Manual';
  // a lot more etc...

整数としてのキーが(私の場合は2147483647)450661000124102より大きいため、問題は「心臓除細動、AED」にありました。PHP_MAX_INT

解決策:必要に応じて文字列キーを使用します。

私の場合、キーが整数である必要はありませんでした。大きなコミットを防ぐためにgit、影響を受ける Snowmed CT Procedure 値のキーにstring、引用符で囲んで単純に型を付けました。

static function getNemsisProcedures() {
  $nemsis[445828009] = 'Assessment  Advanced Spinal Assessment (i.e.,  spinal clearance)';
  $nemsis[425058005] = 'Assessment  Orthostatic Vital Signs';
  // etc....
  $nemsis[89666000] = 'Cardiac  CPR, Manual';

  // KEY IS GREATER THAN PHP_MAX_INT - USE QUOTES:
  $nemsis['450661000124102'] = 'Cardiac  Defibrillation, AED';

  $nemsis[426220008] = 'Cardiac  Defibrillation, Manual';
  // a lot more etc...
于 2016-12-30T18:36:20.790 に答える