昨天我头疼。
基本上我有一些带有字符串键的数据的关联数组(包含数值,但仍然是引用字符串)作为选项放在<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
时,有人可以解释一下我的数组键发生了什么吗?谢谢!
答案 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)
答案 2 :(得分:0)
文档中的几点引出了对此的解释:
来自array_merge:
带有数字键的输入数组中的值将使用从零开始的递增键重新编号。
来自Arrays:
键可以是整数或字符串。如果一个键是整数的标准表示,它将被解释为这样(即“8”将被解释为 8 ,而“08”< / em>将被解释为“08”)。
这解释了为什么第一个键不被视为数字键,因此它们不会被重新编入索引。您的其他键被视为数字键。