PHP数组键值映射问题

时间:2011-06-29 01:26:10

标签: php arrays

我刚刚在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)?

非常感谢任何帮助/澄清。如果需要澄清这个问题,请告诉我。非常感谢。

4 个答案:

答案 0 :(得分:3)

这是以这种方式实现的,因为它是最高效的解决方案 - 只使用maximum_specified_key + 1,而不是to find a hole in enumration

答案 1 :(得分:1)

我认为它与PHP数组的工作方式有关。每个都有eachcurrentnextpos和类似方法的内部光标。我的猜测:当指定一个新键时,如果它高于当前光标,则光标前进到该位置,以便在该点之后添加的任何内容仍然位于当前位置+ 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
)