我有7个对象数组。每个对象都包含数据。我需要将这些阵列合并在一起,并使用
$arrayTotal = $array1;
$arrayTotal = array_merge($arrayTotal,$array2)
$arrayTotal = array_merge($arrayTotal,$array3)
$arrayTotal = array_merge($arrayTotal,$array4)
...
所有的工作都很好,直到我有了大约700个项目的总数组(每个子数组有100个项目)。Apache停止响应,我想是因为内存问题,因为有太多的大数组。我在第4次或第5次合并时遇到了问题。
合并它们并避免错误的最佳方法是什么?
更新:
[Sat Sep 15 10:17:36 2012] [notice] Apache/2.2.21 (Win32) PHP/5.3.9 configured -- resuming normal operations
[Sat Sep 15 10:17:36 2012] [notice] Server built: Sep 10 2011 11:34:11
[Sat Sep 15 10:17:36 2012] [notice] Parent: Created child process 3908
[Sat Sep 15 10:17:36 2012] [notice] Child 3908: Child process is running
[Sat Sep 15 10:17:36 2012] [notice] Child 3908: Acquired the start mutex.
[Sat Sep 15 10:17:36 2012] [notice] Child 3908: Starting 64 worker threads.
[Sat Sep 15 10:17:36 2012] [notice] Child 3908: Starting thread to listen on port 8080.
[Sat Sep 15 10:17:53 2012] [notice] Parent: child process exited with status 3221225477 -- Restarting.
这是我的apache错误日志。我确实找到了一些将文件复制到system32文件夹的解决方案,但它们不起作用
array_merge
可以接受无限数量的参数,因此您可以将它们全部放在一个函数调用中:
$arrayTotal = array_merge($array1,$array2,$array3...);
这应该可以解决问题,因为我过去使用过数千个项目的数组,没有任何问题。
使用+比使用array_merge 更优化
这样写,它更快,使用更少的资源,这似乎是的问题
$arrayTotal = $array1 + $array2 + $array3 + $array4; //add as much as you need :)
注意:多亏了php array_merge页面上的@ficuscr,真正值得关注的是
如果您想将第二个数组中的数组元素附加到第一个数组,同时不覆盖第一个数组的元素,也不重新索引,请使用+数组联合运算符
简而言之,如果您只想附加内容,而不关心重复项,请使用+
问题不在array_merge中,而是在我对外部文件所做的curl中。在我看来,文件对curl来说太大了,然后我们遇到了内存问题,在php.ini中增加内存并不能解决
在峰值内存使用方面,与array_merge($a, $b)
和[...$a, ...$b]
相比,array_push($a, ...$b)
使用的内存最少。峰值内存使用比较:
- CCD_ 5=>peakMemory=$aMemory+$b Memory
- CCD_ 6=>peakMemory=2*$aMemory+$b Memory
- CCD_ 7=>peakMemory=2*$aMemory+$b Memory
此外,如果使用array_merge或省略号运算符来减少峰值内存使用量,请确保将返回值分配给最大的数组。