php 数组连续相同,php – 如何多次合并相同的数组?

我想请求这项简单任务的帮助.假设我有一个数组(‘a’,’b’,’c’).

我想要的是将完全相同的数组多次合并到相同或新的空数组中.例如,将它合并为3x将产生以下结果:

array('a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c')

我知道,有array_merge,但是如果我有可选的数量应该合并数组,如何使用它?当然我可以循环和合并:

$new = array();

for ($i=0; $i < $howManyTimes; $i++) {

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

}

或者我可以使用hack,在字符串和数组之间玩杂耍:

$new = str_split(str_repeat(implode('', array('a', 'b', 'c')), $howManyTimes));

但是,这些方法都不是很好,所以我很感激任何想法和其他/更好的方法在PHP(5)中做我需要的.

谢谢!

编辑:

得到@Amal Murali的答案后,似乎没有更好或更优雅的解决方案.

但是,为了使这个问题更有价值,我做了一些测试.通过10 000次迭代并使用示例数组:

>循环中的array_merge()大约需要37秒

>数组到字符串到数组技巧可笑7毫秒!!

这并不意外,因为array_merge可能会在每次迭代时进行数组扫描,但仍然需要记住.

无论如何,谢谢大家的意见;)

解决方法:

速度与“优雅”

问题是:array_merge()在PHP中速度很慢.为什么?好吧,那是因为它确实是它的名字:它合并哈希表.在PHP中,数组是哈希表,并且根据定义,这种结构上的合并操作不能快速.

但是,您可能希望采用一些“优雅”的方式来解决问题.这就是为什么首先要记住的是array_merge().但是 – 当普通循环更快时就是这种情况.所以你需要决定你的意图 – 拥有“漂亮”的代码或拥有“快速”代码.

处理array_merge()

实际上,array_merge()对于这种情况并不好.那是因为它会将此函数正好调用N次,其中N是重复次数.非常糟糕,因为正如我已经说过的,array_merge()很慢(因为哈希表操作成本).

不过,您可以通过正确使用此功能来执行此操作:

function repeatMerge($array, $rCount)

{

return call_user_func_array('array_merge', array_fill(1, $rCount, $array));

}

为什么这比使用array_walk()的选项更好?因为上面的函数只调用一次array_merge():它将首先收集所有需要的数组,然后 – 立即调用它们的合并函数.因此,所有哈希表操作开销只会进行一次.因此,上面的选项将在普通循环附近执行时间(这个问题最快)

普通循环&速度

最快的方法就是完全避免使用array_merge().喜欢:

function repeatLoops($array, $rCount)

{

$result = [];

$eCount = count($array);

for($j=0; $j

{

for($i=0; $i

{

$result[]=$array[$i];

}

}

return $result;

}

是.我们使用两个嵌套循环.但是我们总是写到数组的结尾,它的运行速度很快.但是,一般来说,我们只会赢得array_merge()的开销 – 因为在低级别,两个选项都可以归结为写入哈希表.

所以,测试一下

我已经使用Benchmark进行上述功能的相对测试.你可能会看到,事实上,第二个选项只赢得了“一些”时间(因此总时间较短,但只有一些常数) – 这是预期的 – 正如我所说,两个函数都会做同样的工作,只有差别是第一个函数将有array_merge()开销,这将完成一次.以下是测试数据:

$array = range(1, 1000);

$count = 1000;

并测试结果为1E1次:

//first function (repeatMerge), 1E1=10 times

array(3) {

[1]=>

float(2.1156709194183)

[2]=>

float(0.21156709194183)

[3]=>

int(10)

}

//second function (repeatLoops), 1E1=10 times

array(3) {

[1]=>

float(1.6837940216064)

[2]=>

float(0.16837940216064)

[3]=>

int(10)

}

和1E2次:

//first function (repeatMerge), 1E2=100 times

array(3) {

[1]=>

float(20.907063007355)

[2]=>

float(0.20907063007355)

[3]=>

int(100)

}

//second function (repeatLoops), 1E2=100 times

array(3) {

[1]=>

float(16.947901964188)

[2]=>

float(0.16947901964188)

[3]=>

int(100)

}

(你可以检查代码here的粘贴 – 因为它使用第三方库而不可能制作小提琴,此外,小提琴的执行时间有限).一点点解释(如果你不在github上检查那个).

数组中的[1](第一个索引):总执行时间

> [2](第二个索引)数组:avg.执行时间处理时间

数组中的[3](第三个索引):总迭代次数

标签:php,arrays

来源: https://codeday.me/bug/20190624/1278389.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值