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

$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;

array_merge ($a, $b)应该完全满足您的需要,至少使用php 5+。

(相关)+PHP中数组的运算符

您发布的输出都不是来自array_merge();,array_merge();的输出应该是您所需要的:print_r(array_merge($a,$b)); // outputs => Array ( [0] => a [1] => b [2] => c [3] => d )。

我完全不同意"附加"这个词。附加实际上意味着一个数组的项成为另一个(目标)数组的元素,该数组可能已经有一些元素,因此更改了目标数组。合并分配一个新数组并复制两个数组的元素,而追加实际上意味着在不分配额外内存的情况下重用目标数组元素。

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拥有相同的密钥,它就不会做任何事情。

注意,如果您的键不是数字而是字符串,则来自文档:如果输入数组具有相同的字符串键,则该键的后一个值将覆盖前一个值。

或者使用modern splat operator作为@bstoney answer stackoverflow.com/a/37065301/962634

在php 5.6+中实现这一点的另一种方法是使用...令牌

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

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

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

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

这也适用于任何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为空,则会导致致命错误。

哪一个术语用于这种语法?(例如,在JS中,它被称为Spread Operator)或者您可以提供到文档的链接吗?

@在PHP中,您会发现...通常被称为splat operator。

为什么不使用

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

为什么不使用这个,正确的,内置的方法呢?

OP在哪里说他"不想使用"array_merge()…?

@Kittencodings-阅读问题的"编辑历史记录"…最初的问题是题为PHP append one array to another (not array_merge or array_push)…随后修改为PHP append one array to another (not array_merge or +),然后改为当前标题

@马克贝克哇!我不知道,所以有编辑历史!很抱歉,谢谢,这改变了很多,并且有点阻止版主把话放进人们的口中,我以前觉得有些问题被破坏了,他们的评论被删除/编辑的内容无效了,尽管我想大多数人可能不读编辑历史,但我相信从现在开始,Heck会这样做的。

// 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"  Example 1 Output:";

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"  Example 2 Output:";

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"  Example 3 Output:";

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"  Example 4 Output:";

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

)

参考源代码

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

如果

一个或两个数组都有关联键

两个数组的键都不重要

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

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

这样做还有一个好处,就是不影响输入数组。

是的,更安全的方法是提取数组的值,这样就不会合并到同一个键中。

在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

", microtime(true) - $start);

// Test2 (foreach)

$start = microtime(true);

foreach ($array2 as $v) {

$array1[] = $v;

}

echo sprintf("Test 2: %.06f

", 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

", microtime(true) - $start);

产生:

Test 1: 0.008392

Test 2: 0.004626

Test 3: 0.003574

我相信从PHP7开始,方法3是一个更好的选择,因为foreach循环现在的行为方式是复制一个被迭代的数组。

虽然方法3并不能严格地回答问题中"非数组推"的标准,但它是一条线,在所有方面都是最高性能的,我认为这个问题是在……语法是一种选择。

对于大数组,最好在不合并数组的情况下进行连接,以避免内存复制。

$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

", microtime(true) - $start);

// Test2 (avoid copy)

$start = microtime(true);

foreach ($array2 as $v) {

$array1[] = $v;

}

echo sprintf("Test 2: %.06f

", microtime(true) - $start);

// Test 1: 0.004963

// Test 2: 0.000038

工作起来很有魅力,对我来说这个方法快了50倍。

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

// 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

此答案不会给页面带来任何新信息。几年前公布了绩效比较。

在PHP7之前,您可以使用:

array_splice()引用数组(第一个参数)进行操作,并将数组(第四个参数)值替换为从第二个参数和第三个参数的数目开始的值列表。当我们将第二个参数设置为源数组的结尾,将第三个参数设置为零时,我们将第四个参数值附加到第一个参数

你应该给那些不遵循非移除拼接魔法的人一些解释。

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

$products = array();

//just example

for($brand_id=1;$brand_id<=3;$brand_id++){

array_merge($products,getByBrand($brand_id));

}

// it will create empty array

print_r($a);

//check if array of products is empty

for($brand_id=1;$brand_id<=3;$brand_id++){

if(empty($products)){

$products = getByBrand($brand_id);

}else{

array_merge($products,getByBrand($brand_id));

}

}

// it will create array of products

希望有帮助。

这个怎么样?

$appended = $a + $b;

如我所说,它将把键和以下结果进行比较:array([0]=>A[1]=>B)

你确定它会比较钥匙吗?说明文档(emphasis mine):"如果输入数组具有相同的字符串键,则该键的后一个值将覆盖前一个值。但是,如果数组包含数字键,则后面的值不会覆盖原始值,而是会被追加。"。你确定你的钥匙实际上不是'0' => 'a'…而不是0 => 'a'?

我刚试过。

@piskvor键的"0"和"0"之间没有区别。

戈登是对的。重点是数字键(而不是整数键)。

嗯,很有趣。这可能意味着文档有误。uk.php.net/manual/en/function.array-merge.php

@piskvor这是array_merge的文档。+运算符不是array_merge的别名。在问题下方查看我的链接。

@戈登:啊,你说得对——这就是我同时想到两件事的原因。php.net/manual/en/language.operators.array.php是用于array + array的文档

php 把数组赋给另一个数组,php将一个数组附加到另一个数组(不是array_push或+)相关推荐

  1. python将一个列表赋值给另一个列表_将一个列表分配给另一个

    在Python中,所有的东西都是一个对象,这意味着所有的东西都有自己的内存.在 初始化listOne = [1, 2, 3]时,会给它一个内存地址.在 然后使用赋值运算符=将listOne的内存位置分 ...

  2. 通过循环按行顺序为一个 5×5 的二维数组 a 赋 1 到 25 的自 然数,然后输出该数组的左下半三角

    题目:通过循环按行顺序为一个 5×5 的二维数组 a 赋 1 到 25 的自 然数,然后输出该数组的左下半三角 分析:显而易见,数组赋值是比较简单的事情,突破点在于只输出数组的左下半角,左下半角的特点 ...

  3. c#数组赋初值_JavaScript数组的声明、访问和遍历方法

    1.数组的概念:数组就是使用单独的变量名来存储一系列的值.当你要存储100个相同概念的数据时,比如学生信息,如果要创建100个变量是不现实的,使用数组变量,就可以存储这100个数据.JavaScrip ...

  4. c#数组赋初值_【自学C#】|| 笔记 13 数组

    上一章最后讲的是正则表达式做一下总结. 总之就是通过"/d"这样的符号代替数字或字符什么的,然后通过"{n}"这种方式确定重复多少个,再通过"|&qu ...

  5. c#数组赋初值_C#数组初始化

    C#的数组初始化是在声明数组时将初始值放在大括号({})之内.如果没有指定初始值,则数组成员将自动初始化为该数组类型的默认初始值.请阅读数组的属性.如果将数组声明为某类型的字段,则当实例化该类型时它将 ...

  6. [JS]请给Array本地对象增加一个原型方法,它用于删除数组条目中重复的条目(可能有多个),返回值是一个包含被删除的重复条目的新数组。

    请给Array本地对象增加一个原型方法,它用于删除数组条目中重复的条目(可能有多个),返回值是一个包含被删除的重复条目的新数组. 刚开始复习js题还不太习惯 CSDN上看了一个帖子,说是牛客上的标答, ...

  7. ACMNO.20 C语言-插入队列 已有一个已排好的9个元素的数组,今输入一个数要求按原来排序的规律将它插入数组中。 输入 第一行,原始数列。 第二行,需要插入的数字。

    题目描述 已有一个已排好的9个元素的数组,今输入一个数要求按原来排序的规律将它插入数组中. 输入 第一行,原始数列. 第二行,需要插入的数字. 输出 排序后的数列 样例输入 1 7 8 17 23 2 ...

  8. 函数模板案例_利用函数模板封装一个排序的函数,可以对不同数据类型数组进行排序 排序规则从大到小,排序算法为选择排序 分别利用char数组和int数组进行测试

    案例描述: 利用函数模板封装一个排序的函数,可以对不同数据类型数组进行排序 排序规则从大到小,排序算法为选择排序 分别利用char数组和int数组进行测试 #include <iostream& ...

  9. Java黑皮书课后题第7章:*7.12(倒置数组)7.7节中的reverse方法通过复制到新数组实现倒置。改写方法将参数中传递的数组倒置,并返回该数组。编写一个测试程序,输入10个数字,倒置它们并显示

    7.12(倒置数组)7.7节中的reverse方法通过复制到新数组实现倒置.改写方法将参数中传递的数组倒置,并返回该数组.编写一个测试程序,输入10个数字,倒置它们并显示 题目 题目描述 破题 代码 ...

最新文章

  1. 配置Quartz.net Cluster以及远程管理
  2. android播放flv,Android:从url播放flv视频流
  3. 计算机信息工程专业985,信息工程学院
  4. 解决:fatal: not a git repository (or any of the parent directories): .git的问题
  5. 39套漂亮的后台模板
  6. 幂等校验是什么意思_什么是接口的幂等性,如何实现接口幂等性?一文搞定
  7. 经典神经网络 -- MobileNet : 设计原理与pytorch实现
  8. 2021-09-18
  9. 安卓UI相关开源项目库汇总
  10. iOS 开发中出现假死解决思路
  11. Veracrypt和Cryptomator的使用方式对比
  12. 如何利用Web of Science进行科学研究
  13. 网易云信第三方接口调用超详细Demo
  14. Linux网络编程之获取网络天气信息
  15. python的输出语法_Python入门语法综述
  16. gs_fs0文件是什么_“ FS” /“ GS”寄存器的用途是什么?
  17. 理解 Thread.Sleep 函数
  18. BZOJ3693:圆桌会议(Hall定理)
  19. 计算机文化基础008,2013 中国成人教育 翻转课堂在高校计算机文化基础课中的应用研究_刘桂花...
  20. Android软件中嵌入地图之三:Google地图

热门文章

  1. [骨科手术导航]2D/3D医学图像配准研究_罗博博_南方科技大学
  2. 一个简单的插件框架示例
  3. TreeView数据绑定的方法
  4. 在一个JS文件中包含中文字符串,通过innerHTML输出后中文乱码?
  5. SQL Server 2005 常用数据类型详解
  6. npm ERR! cb.apply is not a function npm ERR! A complete log of this run can be found in: npm ERR!
  7. ElasticSearch配置扩展分词
  8. 操作系统(三十五)连续分配管理方式
  9. 【动态规划】分组背包
  10. php项目列表,php – 如何获取类似项目的列表