PHP将一个数组附加到另​​一个数组(不是array_push或+)

时间:2010-11-24 16:09:57

标签: php arrays function

如何在不比较键的情况下将一个数组附加到另​​一个数组?

$a = array( 'a', 'b' );
$b = array( 'c', 'd' );

最后应该是:Array( [0]=>a [1]=>b [2]=>c [3]=>d ) 如果我使用[]array_push之类的内容,则会导致以下结果之一:

Array( [0]=>a [1]=>b [2]=>Array( [0]=>c [1]=>d ) )
//or
Array( [0]=>c [1]=>d )

它应该是一种东西,这样做,但是以更优雅的方式:

foreach ( $b AS $var )
    $a[] = $var;

12 个答案:

答案 0 :(得分:361)

array_merge是优雅的方式:

$a = array('a', 'b');
$b = array('c', 'd');
$merge = array_merge($a, $b); 
// $merge is now equals to array('a','b','c','d');

做类似的事情:

$merge = $a + $b;
// $merge now equals array('a','b')

不起作用,因为+运算符实际上并没有合并它们。如果他们$a的密钥与$b相同,则无法执行任何操作。

答案 1 :(得分:48)

在PHP 5.6+中执行此操作的另一种方法是使用Traversable令牌

$a = array('a', 'b');
$b = new ArrayIterator(array('c', 'd'));

array_push($a, ...$b);

// $a is now equals to array('a','b','c','d');

这也适用于任何$b

operator<<

警告但是,如果数组cout为空,这将导致致命错误

答案 2 :(得分:30)

为什么不使用

$appended = array_merge($a,$b); 

为什么不想使用这个正确的内置方法。

答案 3 :(得分:15)

<?php
// Example 1 [Merging associative arrays. When two or more arrays have same key
// then the last array key value overrides the others one]

$array1 = array("a" => "JAVA", "b" => "ASP");
$array2 = array("c" => "C", "b" => "PHP");
echo " <br> Example 1 Output: <br>";
print_r(array_merge($array1,$array2));

// Example 2 [When you want to merge arrays having integer keys and
//want to reset integer keys to start from 0 then use array_merge() function]

$array3 =array(5 => "CSS",6 => "CSS3");
$array4 =array(8 => "JAVASCRIPT",9 => "HTML");
echo " <br> Example 2 Output: <br>";
print_r(array_merge($array3,$array4));

// Example 3 [When you want to merge arrays having integer keys and
// want to retain integer keys as it is then use PLUS (+) operator to merge arrays]

$array5 =array(5 => "CSS",6 => "CSS3");
$array6 =array(8 => "JAVASCRIPT",9 => "HTML");
echo " <br> Example 3 Output: <br>";
print_r($array5+$array6);

// Example 4 [When single array pass to array_merge having integer keys
// then the array return by array_merge have integer keys starting from 0]

$array7 =array(3 => "CSS",4 => "CSS3");
echo " <br> Example 4 Output: <br>";
print_r(array_merge($array7));
?>

<强>输出:

Example 1 Output:
Array
(
[a] => JAVA
[b] => PHP
[c] => C
)

Example 2 Output:
Array
(
[0] => CSS
[1] => CSS3
[2] => JAVASCRIPT
[3] => HTML
)

Example 3 Output:
Array
(
[5] => CSS
[6] => CSS3
[8] => JAVASCRIPT
[9] => HTML
)

Example 4 Output:
Array
(
[0] => CSS
[1] => CSS3
)

<强> Reference Source Code

答案 4 :(得分:13)

这是一个相当古老的帖子,但我想添加一些关于将一个数组附加到另​​一个数组的内容:

如果

  • 一个或两个数组都有关联键
  • 两个阵列的键无关紧要

你可以使用这样的数组函数:

array_merge(array_values($array), array_values($appendArray));

array_merge不合并数字键,因此它附加$ appendArray的所有值。使用本机php函数而不是foreach循环时,在具有大量元素的数组上应该更快。

答案 5 :(得分:9)

对于大数组,最好不要使用array_merge连接,以避免内存复制。

$array1 = array_fill(0,50000,'aa');
$array2 = array_fill(0,100,'bb');

// Test 1 (array_merge)
$start = microtime(true);
$r1 = array_merge($array1, $array2);
echo sprintf("Test 1: %.06f\n", microtime(true) - $start);

// Test2 (avoid copy)
$start = microtime(true);
foreach ($array2 as $v) {
    $array1[] = $v;
}
echo sprintf("Test 2: %.06f\n", microtime(true) - $start);


// Test 1: 0.004963
// Test 2: 0.000038

答案 6 :(得分:8)

继bstoney和Snark的回答后,我对各种方法进行了一些测试:

$array1 = array_fill(0,50000,'aa');
$array2 = array_fill(0,50000,'bb');

// Test 1 (array_merge)
$start = microtime(true);
$array1 = array_merge($array1, $array2);
echo sprintf("Test 1: %.06f\n", microtime(true) - $start);

// Test2 (foreach)
$start = microtime(true);
foreach ($array2 as $v) {
    $array1[] = $v;
}
echo sprintf("Test 2: %.06f\n", microtime(true) - $start);

// Test 3 (... token)
// PHP 5.6+ and produces error if $array2 is empty
$start = microtime(true);
array_push($array1, ...$array2);
echo sprintf("Test 3: %.06f\n", microtime(true) - $start);

产生:

Test 1: 0.008392 
Test 2: 0.004626 
Test 3: 0.003574

我相信从PHP 7开始,方法3是一个明显更好的选择,因为foreach loops now act的方式是复制数组的副本。

虽然方法3严格来说不是对“array_push”标准的回答。在这个问题中,它是一条线,在所有方面都是最高性能的,我认为问题是在......语法之前被问到的。

答案 7 :(得分:3)

自PHP 7.4起,您可以使用 ...运算符。在其他语言(包括Ruby)中,也称为 splat运算符

$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
var_dump($fruits);

输出

array(5) {
    [0]=>
    string(6) "banana"
    [1]=>
    string(6) "orange"
    [2]=>
    string(5) "apple"
    [3]=>
    string(4) "pear"
    [4]=>
    string(10) "watermelon"
}

Splat运算符应该比 array_merge 具有更好的性能。这不仅是因为splat运算符是一种语言结构,而array_merge是一个函数,也是因为编译时优化可以对常量数组进行执行。

此外,我们可以在数组的任何位置使用splat运算符语法,因为可以在splat运算符之前或之后添加普通元素。

$arr1 = [1, 2, 3];
$arr2 = [4, 5, 6];
$arr3 = [...$arr1, ...$arr2];
$arr4 = [...$arr1, ...$arr3, 7, 8, 9];

答案 8 :(得分:0)

如果要将空数组与现有新值合并。您必须先将其初始化。

<?php
$date = "31-01-2017";
$date = date("Y-m-d", strtotime($date));
echo $date;
?>

希望得到它的帮助。

答案 9 :(得分:0)

在PHP7之前,你可以使用:

type VendorMapInfo struct {
    MapHierarchyString string      `xml:"mapHierarchyString,attr"`
    FloorRefID         interface{} `xml:"floorRefId,attr"`
    Image              Image       `xml:"Image"`
    FloorDimension     VendorFloorDimension
}

type Image struct {
    Name string `xml:"imageName,attr"`
}

func (mf *VendorMapInfo) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
    // Attributes
    for _, attr := range start.Attr {
        switch attr.Name.Local {
        case "mapHierarchyString":
            mf.MapHierarchyString = attr.Value
        case "floorRefId":
            mf.FloorRefID = findFloorRefIDType(attr.Value)
        }
    }

    for {
        token, err := d.Token()
        if err != nil {
            return err
        }

        switch el := token.(type) {
        case xml.StartElement:
            if el.Name.Local == "Image" {
                item := new(Image)
                if err = d.DecodeElement(item, &el); err != nil {
                    return err
                }
                mf.Image = *item
            }
        case xml.EndElement:
            if el == start.End() {
                return nil
            }
        }
    }

    return nil
}

{Locations:{Space: Local:} WirelessClientLocation:[{MacAddress:00:00:00:00:00:00 MapInfo:{MapHierarchyString:Head office>Ground floor>Store FloorRefID:-1122334455667789 Image:{Name:floorPlan1.png} FloorDimension:{Length:0 Width:0 Height:0 OffsetX:0 OffsetY:0 Unit:}}} {MacAddress:11:11:11:11:11:11 MapInfo:{MapHierarchyString:Head office>Ground floor>Store FloorRefID:-1122334455667789 Image:{Name:floorPlan1.png} FloorDimension:{Length:0 Width:0 Height:0 OffsetX:0 OffsetY:0 Unit:}}} {MacAddress:26:cd:96:46:0b:2b MapInfo:{MapHierarchyString: FloorRefID:0 Image:{Name:} FloorDimension:{Length:0 Width:0 Height:0 OffsetX:0 OffsetY:0 Unit:}}}]} 参照数组(第一个参数)进行操作,并将数组(第四个参数)值替换为从第二个参数开始的值列表和第三个参数的数量。当我们将第二个参数设置为源数组的结尾而第三个设置为零时,我们将第四个参数值附加到第一个参数

答案 10 :(得分:0)

foreach循环比array_merge更快,可以将值附加到现有数组,因此如果要将数组添加到另一个数组的末尾,请选择循环。

// Create an array of arrays
$chars = [];
for ($i = 0; $i < 15000; $i++) {
    $chars[] = array_fill(0, 10, 'a');
}

// test array_merge
$new = [];
$start = microtime(TRUE);
foreach ($chars as $splitArray) {
    $new = array_merge($new, $splitArray);
}
echo microtime(true) - $start; // => 14.61776 sec

// test foreach
$new = [];
$start = microtime(TRUE);
foreach ($chars as $splitArray) {
    foreach ($splitArray as $value) {
        $new[] = $value;
    }
}
echo microtime(true) - $start; // => 0.00900101 sec
// ==> 1600 times faster

答案 11 :(得分:-5)

这个怎么样:

$appended = $a + $b;