无法在PHP中串联2个数组


68

我最近学习了如何在PHP中使用+运算符连接2个数组。

但是考虑一下这段代码...

$array = array('Item 1');

$array += array('Item 2');

var_dump($array);

输出为

array(1){[0] =>字符串(6)“项目1”}

为什么这不起作用?跳过速记并使用$array = $array + array('Item 2')也不起作用。它与按键有关吗?


Answers:


136

两者都有一个键0,并且组合数组的方法将折叠重复项。尝试array_merge()改为使用。

$arr1 = array('foo'); // Same as array(0 => 'foo')
$arr2 = array('bar'); // Same as array(0 => 'bar')

// Will contain array('foo', 'bar');
$combined = array_merge($arr1, $arr2);

如果数组中的元素使用不同的键,则+运算符会更合适。

$arr1 = array('one' => 'foo');
$arr2 = array('two' => 'bar');

// Will contain array('one' => 'foo', 'two' => 'bar');
$combined = $arr1 + $arr2;

编辑:添加了一个代码片段来阐明


22
请注意,array_merge函数仍将折叠非数字数组键的重复项。例如array_merge(array(“ colour” =>“ red”),array(“ colour” =>“ green”))将产生array(“ colour” =>“ green”)的值;
高度不规则

1
$ arr1 = array('foo'); //与array(0 =>'foo')$ arr2 = array('bar');相同 //与array(0 =>'bar')// //将包含array('bar'); $ combined = array_merge($ arr1,$ arr2);
xoxn-- 1'w3k4n16年

array(123 => 'foo')array("123" => 'foo')与键相同时,使用键时将忽略它们array_merge。看看这个测试
luukvhoudt


7

IMO先前的某些答案不正确!(可以对答案进行排序,从最早的到最新的)。

array_merge()实际上合并了数组,这意味着,如果数组具有共同的项目,则将省略副本之一。这同样适用于+(工会)。

我没有找到此问题的“替代方法”,但可以手动进行...

它去了:

<?php
$part1 = array(1,2,3);
echo "array 1 = \n";
print_r($part1);
$part2 = array(4,5,6);
echo "array 2 = \n";
print_r($part2);
$ans = NULL;
for ($i = 0; $i < count($part1); $i++) {
    $ans[] = $part1[$i];
}
for ($i = 0; $i < count($part2); $i++) {
    $ans[] = $part2[$i];
}
echo "after arrays concatenation:\n";
print_r($ans);
?>

17
这是错误的。 array_merge如果它们是具有相同键的关联数组,则只会从结果数组中省略它们。对于数字数组,所有项目都合并到一个新数组中,该数组的长度是原始数组的精确总和。在该示例中,您正在使用数值数组,这意味着array_merge将为您完美地工作。我同意array_merge不应将其用于关联数组,但是显然,这不是您在此处显示的内容。
JMTyler

@JMTyler +1很棒的评论!我应该选择一个使用关联数组的示例。我发布此答案的主要原因是,+除非密钥不同,否则在任何一种情况下(关联或不关联)都不应使用接受的答案。和array_merge在相同项目的情况下将包含重复项目。
尼尔·阿法西

3
“以前的所有答案都不正确”无济于事,因为答案会根据票数重新排序。
Christian Lescuyer

@ChristianLescuyer,很容易看到每个答案旁边的日期/小时。
尼尔·阿法西

6

+称为Union运算符,与Concatenation运算符不同(PHP没有用于数组的数组)。该说明明确表示:

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

与示例:

$a = array("a" => "apple", "b" => "banana");
$b = array("a" => "pear", "b" => "strawberry", "c" => "cherry");
$c = $a + $b;

array(3) {
  ["a"]=>
  string(5) "apple"
  ["b"]=>
  string(6) "banana"
  ["c"]=>
  string(6) "cherry"
}

由于两个数组都具有一个键项0,因此可以预期结果。

要连接,请使用array_merge


3

尝试array_merge。

$array1 = array('Item 1');

$array2 = array('Item 2');

$array3 = array_merge($array1, $array2);

我认为这是因为您没有为任何一个分配键,因此它们都具有0的键,并且+不会重新编制索引,因此它试图覆盖它。




0

这适用于非关联数组:

while(($item = array_shift($array2)) !== null && array_push($array1, $item));


-3

试着说

$array[] = array('Item 2'); 

尽管看起来您正在尝试将一个数组添加到一个数组中,$array[][]但这并不是您的标题所暗示的。


2
不一样的东西。您将获得array('Item 1', array('Item 2'))一个多维数组。
deceze

1
是的,这就是我想他想要的。
乔什(Josh K)2010年

-5

您可以使用运算符。$ array3 = $ array1。$ array2;


3
那是concat运算符。您最终会得到一些提示和“ ArrayArray”。
Jonnix 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.