【问题标题】:PHP: Adding arrays togetherPHP:将数组添加在一起
【发布时间】:2010-05-11 15:01:08
【问题描述】:

有人可以帮我解释一下吗?我有两个 sn-ps 代码,一个按我的预期工作,但另一个没有。

这行得通

$a = array('a' => 1, 'b' => 2);
$b = array('c' => 3);
$c = $a + $b;
print_r($c);

// Output
Array
(
    [a] => 1
    [b] => 2
    [c] => 3
)

这不是

$a = array('a', 'b');
$b = array('c');
$c = $a + $b;
print_r($c);

// Output
Array
(
    [0] => a
    [1] => b
)

这是怎么回事??为什么第二个版本也不将两个数组加在一起?我误解了什么?我应该怎么做?还是 PHP 的 bug?

【问题讨论】:

  • 你的例子是错误的。第二个输出应该是1 => 'a', 2 => 'b'
  • @Gordon:不,我确实知道 + 运算符的含义,只是......有点误解了它:p
  • @Tgr:这是错误的,但我现在修好了。这就是我现在至少在这里输出的内容......
  • 这就是我链接其他帖子的原因。所以你会更好地理解它;)

标签: php arrays


【解决方案1】:

这是记录在案且正确的:http://us3.php.net/manual/en/language.operators.array.php

+ 运算符将剩余键的元素从右手数组附加到左手,而重复的键不会被覆盖。

所以我猜这不是 php 中的错误,并且假设会发生什么。我以前也没有注意到这一点。

【讨论】:

  • 你可以说这是一个设计缺陷。 array_merge-ing 当一些键是数字时,两个关联数组会导致奇怪的结果(这对于表示数据库记录的数组来说很常见)。
  • 实际上,如果您需要合并两个数组并保留数字键(或者更确切地说合并数字键重要的数组),它是设计使然并且非常有用。正如这里的其他人所说,您应该使用 array_merge()。
【解决方案2】:

简而言之,这是有效的,因为如果你 print_r 同时 $a 和 $b 你有:

Array
(
    [a] => 1
    [b] => 2
)

Array
(
    [c] => 3
)

如您所见,所有元素都有不同的键...

对于第二个示例数组,如果你打印 $a 和 $b 你有:

Array
(
    [0] => a
    [1] => b
)

Array
(
    [0] => c
)

'a' 和 'c' 的 0 键是这里的问题,具有相同键的第二个数组的元素将被丢弃......如果你这样做:

$c = $b + $a; // instead of $c = $a + $b;

结果将是:

Array
(
    [0] => c
    [1] => b
)

【讨论】:

  • 对正在发生的事情进行了很好的视觉解释。
【解决方案3】:

要添加两个非关联数组,您需要使用array_merge 函数:

合并一个或多个元素 数组在一起,使的值 一个附加到末尾 前一个。它返回结果 数组。

如果输入数组有相同的 字符串键,然后是后面的值 该键将覆盖前一个 一。但是,如果数组包含 数字键,后面的值不会 覆盖原始值,但会 被附加。

如果只给出一个数组并且 数组是数字索引的,键 以连续的方式重新索引。

【讨论】:

    【解决方案4】:

    我认为这只是无证行为,但我可能错了。无论哪种方式,如果您想像这样将数组放在一起,请使用array_merge

    见:http://ca2.php.net/manual/en/function.array-merge.php

    【讨论】:

      【解决方案5】:

      在处理数组时,加号运算符不会覆盖索引,也不会重新索引数组。在您的示例中,c 的索引 0 与 a 一样,因此被丢弃。使用 array_merge。

      【讨论】:

        【解决方案6】:
        array_splice($a,count($a),0,$b); //array $a becomes a group of $a and $b arrays.
        

        附:它用于索引数组(非关联)

        【讨论】:

          猜你喜欢
          • 2019-05-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-16
          相关资源
          最近更新 更多