【问题标题】:PHP array_merge rekeying -- how's it work?PHP array_merge rekeying——它是如何工作的?
【发布时间】:2012-01-03 16:04:55
【问题描述】:

我昨天头疼。

基本上,我有一个带有字符串键(包含数值,但仍然是带引号的字符串)的一些数据的关联数组作为选项放入<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 时我的数组键发生了什么?谢谢!

【问题讨论】:

  • 您预计会发生什么?
  • 我希望我的数组键得到维护。
  • 来自文档:“输入数组中带有数字键的值将使用从零开始的递增键重新编号。”我猜 '01' 不是由函数的实现确定为数字的。 (c.f.is_numeric('01'))
  • is_numeric('01')is_numeric('10') 都返回真值 -- 为什么合并后 '10' 的键会改变,而 '01' 的键却不会?
  • 因为实现在幕后使用的任何逻辑都与is_numeric使用的逻辑不同。

标签: php array-merge


【解决方案1】:

问题不是来自 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 中是同一种类型,都可以包含整数 和字符串索引。

【讨论】:

    【解决方案2】:

    the manual里解释的很清楚:

    别忘了数字键会被重新编号!

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

    【讨论】:

    • is_numeric('01')is_numeric('10') 都返回真值
    • PHP 正在寻找一个文字整数,而不仅仅是一个“数字”值,因此 1 != "1"
    • 嗯,确实很奇怪。 the comments 中也有一些关于此的内容。
    • Aknosis -- 那为什么 '10' 是一个文字整数,即使它被引用了?
    • -1 因为关联数组中没有重新编号。 PHP 在声明数组时将 '10' 替换为 10,而不是在处理 array_merge() 时。
    【解决方案3】:

    文档中有几点对此进行了解释:

    来自array_merge

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

    来自Arrays

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-04
      • 2014-02-26
      • 2012-07-02
      相关资源
      最近更新 更多