我遇到一个数组更改键值的问题。在下面提供的示例中,它开始正常,但在某些时候,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
这些大数字是总帐科目编号,不能更改为较小的数字。我们的产品中有数以万计的代码,超过一百万行代码,并且无法通过它来查找可能存在问题的地方并重写它。这只是我们在许多地方做的事情的一个通用示例,使用数据库中的数据构建多维数组。我可以在插入数组时简单地将变量转换为字符串来修复上面的示例,但回填1M +代码行不是一个可行的选择。
在我的开发机器上运行php 5.3 MSSQL,Windows和IIS。我没有用上面的代码得到这个错误,但是我只是将变量设置为整数然后将其作为键插入到数组中。即$ gl = 1800001040000000; $ ar [$ gl] = 1;的print_r($ AR);现在我们不会在我们的软件中将变量转换为整数,但是在第一个示例中,当它在我们的一些客户端系统上运行时构建最后一个数组时,php会自行转换它。
所以我的问题是:
我们的软件适用于多个数据库,多个浏览器,窗口和Linux,apache和IIS。我们有数百名客户使用该软件,他们都有自己独特的设置。我们的大多数客户目前使用的是php 5.2,由于我们软件中使用了不推荐使用的功能,因此目前无法对其进行升级。
答案 0 :(得分:1)
我的猜测是你受限于一个整数的最大值,因为PHP会自动转换字符串,其中有效整数值被用作整数的数组键。 PHP手册指出整数的限制因系统而异,但最大的问题是32位系统与64位系统的确定上限。
http://php.net/manual/en/language.types.integer.php
系统上的最大整数值可以从PHP_INT_MAX
常数读取。
答案 1 :(得分:0)
我看到这里没有接受的答案,当然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...
问题在于"心脏除颤,AED"因为作为整数
450661000124102
的键大于PHP_MAX_INT
(在我的情况下为2147483647)。
解决方案:在适用的地方使用字符串键。
在我的情况下,我没有要求键是整数,并且为了防止在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...