PHP array_merge重新加密 - 它是如何工作的?

时间:2012-01-03 16:04:56

标签: php array-merge

昨天我头疼。

基本上我有一些带有字符串键的数据的关联数组(包含数值,但仍然是引用字符串)作为选项放在<select>框中。我想在占位符值的前缀中添加一个占位符值。

我试图使用array_merge:

$placeholder = "Month";
$source = array
(
    '01' => '01 - January',
    '02' => '02 - February',
    '03' => '03 - March',
    '04' => '04 - April',
    '05' => '05 - May',
    '06' => '06 - June',
    '07' => '07 - July',
    '08' => '08 - August',
    '09' => '09 - September',
    '10' => '10 - October',
    '11' => '11 - November',
    '12' => '12 - December'
);

$source = array_merge(array('' => $placeholder), $source);

我看到了奇怪的结果 - 结果$source数组类似于以下内容:

(
    '' => 'Month',
    '01' => '01 - January',
    '02' => '02 - February',
    '03' => '03 - March',
    '04' => '04 - April',
    '05' => '05 - May',
    '06' => '06 - June',
    '07' => '07 - July',
    '08' => '08 - August',
    '09' => '09 - September',
    0 => '10 - October',
    1 => '11 - November',
    2 => '12 - December'
);

请注意,由于某种原因,它开始使用10月到12月似乎是自动递增的整数键。

我可以用以下代码替换array_merge调用:

$source = array('' => $placeholder) + $source;

数组没有重新加密,一切都很好,但我不明白array_merge案例中幕后发生了什么。

当我使用array_merge时,有人可以解释一下我的数组键发生了什么吗?谢谢!

3 个答案:

答案 0 :(得分:5)

问题不是来自array_merge()函数。

如果您在合并之前打印$source,您将拥有以下内容:

array(12) {
  ["01"]=>
  string(12) "01 - January"
  ["02"]=>
  string(13) "02 - February"
  // ...
}

尝试将您的第一个密钥'01'重命名为'1',您将获得以下回复:

array(12) {
  [1]=>
  string(12) "01 - January"
  ["02"]=>
  string(13) "02 - February"
  // ...
}

PHP自动将您的密钥转换为整数。但我不能说你为什么会这样做。

编辑:

我在php.net(PHP.net)上找到了答案:

  

键可以是整数或字符串。如果一把钥匙是标准   表示整数,它将被解释为这样(即“8”   将被解释为8,而“08”将被解释为“08”。   键中的浮点数被截断为整数。索引和关联   数组类型在PHP中是相同的类型,它们都可以包含整数   和字符串索引。

答案 1 :(得分:1)

the manual中非常清楚地解释了:

  

不要忘记数字键会重新编号!

不以'0'开头的键被PHP视为数字 - 因此重新编号。

答案 2 :(得分:0)

文档中的几点引出了对此的解释:

来自array_merge

  

带有数字键的输入数组中的值将使用从零开始的递增键重新编号。

来自Arrays

  

可以是整数或字符串。如果一个键是整数的标准表示,它将被解释为这样(即“8”将被解释为 8 ,而“08”< / em>将被解释为“08”)。

这解释了为什么第一个键不被视为数字键,因此它们不会被重新编入索引。您的其他键被视为数字键。