我刚刚在php.net描述了如何使用值映射的关键字:
$switching = array( 10, // key = 0
5 => 6,
3 => 7,
'a' => 4,
11, // key = 6 (maximum of integer-indices was 5)
'8' => 2, // key = 8 (integer!)
'02' => 77, // key = '02'
0 => 12 // the value 10 will be overwritten by 12
);
我只是不明白11如何分配键6.我知道5是不可能的,因为它已经在第二个元素上用作键,所以跳过它是有意义的。
但是不应该首先直观地分配键4,因为数组10的第一个元素被赋予键0,因此键值从那里递增0..1..2..3..4除非另有说明,否则根据第一个索引指向(例如5 => 6可能有密钥1,3 =&7;密钥2,'a'=> 4如果没有指定则可能有密钥3)?而且,为什么它应该指定11应该指定一个表示索引的最大整数的键(在这种情况下,6已经使用了5)?
非常感谢任何帮助/澄清。如果需要澄清这个问题,请告诉我。非常感谢。
答案 0 :(得分:3)
这是以这种方式实现的,因为它是最高效的解决方案 - 只使用maximum_specified_key + 1
,而不是to find a hole in enumration
答案 1 :(得分:1)
我认为它与PHP数组的工作方式有关。每个都有each
,current
,next
,pos
和类似方法的内部光标。我的猜测:当指定一个新键时,如果它高于当前光标,则光标前进到该位置,以便在该点之后添加的任何内容仍然位于当前位置+ 1。 / p>
答案 2 :(得分:1)
而且,为什么会说11 应该分配一个密钥 表示最大整数 指数(在这种情况下,因为5是6 已经使用过了?)
为什么不呢?正如zerkms所说,它是高效的,所以就是这样。
它或多或少也是你所期望的。给定一个像这样的混合键的数组,你期望array_push()做什么?
当然,如果你在现实生活中遇到这种事情,可能是时候停下来考虑一些重构了。 PHP中的数组非常灵活,必须做出这些有点武断的决定。他们被记录在案。唯一的选择是使数组使用更加严格。
答案 3 :(得分:0)
PHP手册为您提供了所提供链接的答案:
如上所述,如果没有指定密钥,则最大值 采用现有的整数索引,新的密钥就是那个 最大值加1(但至少为0)。如果不存在整数索引 然而,键将为0(零)。
代码:
$switching = array( 10, // key = 0
5 => 6,
3 => 7,
'a' => 4,
11, // key = 6 (maximum of integer-indices was 5)
'8' => 2, // key = 8 (integer!)
'02' => 77, // key = '02'
0 => 12 // the value 10 will be overwritten by 12
);
到目前为止,到达'a'
时的最大密钥为5
,因此根据php手册的下一个可用密钥为5 + 1,即6。
请注意使用的最大整数键 对于这个目前不需要存在于数组中。它只需要 自阵列最后一次以来的某个时间存在于数组中 重新索引。
// empty the array;
foreach( $switching as $key => $value ) {
unset( $switching[$key] );
}
// refill it with new elements
for( $i = 0; $i < 10; $i++ ) {
$switching[] = $i + 1;
}
输出数组:
Array
(
[9] => 1
[10] => 2
[11] => 3
[12] => 4
[13] => 5
[14] => 6
[15] => 7
[16] => 8
[17] => 9
[18] => 10
)