【问题标题】:Couldn't use integer as a key in associative array PHP无法使用整数作为关联数组 PHP 中的键
【发布时间】:2015-07-22 18:43:36
【问题描述】:

我想在关联数组中使用整数作为键。我尝试使用 settype() 方法将其转换为字符串,然后将其与现有的关联数组合并

代码如下:

$Xcenter = 325;
$Ycenter = 59.8;

$Xcenter = strval($XCenter);
$existing_array = array('a'=>'b', 'b'=>'c');
$new_array = array($XCenter=>$YCenter);
$result = array_merge($existing_array, $new_array);
print_r($result);

电流输出:

Array ( [a] => b [b] => c [0] => 59.8 ) 

预期输出:

Array ( [a] => b [b] => c [325] => 59.8 ) 

由于某种原因,它没有将整数转换为字符串。但这对于像下面这样的浮点值非常有效:

Array ( [a] => b [b] => c [148.33333333333] => 59.8 )

【问题讨论】:

  • 来自哪里:$YCenter 来自哪里?也只需删除您的 settype 调用!
  • $Xcenter = "325"代替settype()怎么样?
  • $existing_array[$Xcenter] = 'something'; array_merge 会重新索引数字键,这就是你得到 0 的原因。
  • 根据docsDon't forget that numeric keys will be renumbered。如果你强制 325 成为一个字符串也没关系,它仍然会通过 is_numeric() 并最终被视为一个数字。请改用$result = $old_array + $new_array
  • @Rizier123 你的问题对我来说意义不大,因为 YCenter 是一个值,它与键的索引方式无关。我已将 settype() 替换为 strval

标签: php string integer associative-array


【解决方案1】:

来自array_merge的手册:

如果输入数组有相同的字符串键,那么后面的值 因为该键将覆盖前一个键。但是,如果数组 包含数字键,后面的值不会覆盖原来的 值,但会被附加。

输入数组中带有数字键的值将重新编号为 在结果数组中从零开始递增键。

如果你只想设置一个特定值的键,你不需要合并,你可以像$array[123] = $foo一样设置它。或与$array1 + $array2 联合。但仅供参考,联合不会重新索引数字键,也不会覆盖以前的值。因此,您通常必须反转通常传递给 array_merge 的参数。所以array_merge($a1, $a2)$a2 + $a1 几乎相同,但没有重新索引的数字键。

【讨论】:

  • 即使在将整数存储到关联数组之前将整数转换为字符串,上述语句是否正确?当然,我会将 array_merge 语句更改为像您提到的那样。
  • 鉴于您看到的结果,是的,具有整数值的字符串将被重新编号。手册指出numeric keys will be renumbered。它可能只是对is_numeric($key) 进行内部调用,如果是这样,则将其转换为数字。假设有一个额外的检查,即转换为整数不会像浮点数那样截断值if(is_numeric($key) && ((int)$key == $key)) /*re-index*/
猜你喜欢
  • 2011-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-28
  • 1970-01-01
  • 1970-01-01
  • 2012-04-03
  • 1970-01-01
相关资源
最近更新 更多