0

昨天我头疼。

基本上,我有一个带有字符串键(包含数值,但仍然是带引号的字符串)的一些数据的关联数组<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?谢谢!

4

3 回答 3

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 中是相同的类型,既可以包含整数索引,也可以包含字符串索引。

于 2012-01-03T16:17:44.477 回答
1

手册中解释得很清楚:

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

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

于 2012-01-03T16:11:41.347 回答
0

文档中的几点导致了对此的解释:

array_merge

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

数组

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

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

于 2012-01-03T16:23:53.483 回答