DEV Community

Jimmy Klein
Jimmy Klein

Posted on β€’ Edited on

18 6

Never use array_merge in a loop in PHP

I often see people using array_merge function in a for/foreach/while loop 😱 like this :

$arraysToMerge = [ [1, 2], [2, 3], [5, 8] ];

$arraysMerged = [];
foreach($arraysToMerge as $array) {
    $arraysMerged = array_merge($arraysMerged, $array);
}
Enter fullscreen mode Exit fullscreen mode

It's a very bad practice because it's a performance killer (especially in memory).

Since PHP 5.6, there is a new operator : the spread operator

$arraysToMerge = [ [1, 2], [2, 3], [5,8] ];

$arraysMerged = array_merge([], ...$arraysToMerge);
Enter fullscreen mode Exit fullscreen mode
  • No more performance problem
  • BONUS : no more for/foreach/while loop
  • BONUS : process in one line

Look now at your code base to find code that you can improve πŸ‘©β€πŸ’»πŸ‘¨β€πŸ’»!


Thank you for reading, and let's stay in touch !

If you liked this article, please share. You can also find me on Twitter/X for more PHP tips.

Qodo Takeover

Introducing Qodo Gen 1.0: Transform Your Workflow with Agentic AI

Rather than just generating snippets, our agents understand your entire project context, can make decisions, use tools, and carry out tasks autonomously.

Read full post

Top comments (10)

Collapse
 
attkinsonjakob profile image
Jakob Attkinson β€’

This solution is pretty cool, however if you have an array of objects this solution won't work anymore.

Say you have a list of users and each use has multiple social media accounts.

How would you create an array that has all the social media accounts from all the users? I can't find a better solution than this...

$accounts = [];
foreach ($users as $user) {
    $accounts = array_merge($accounts, $user['socialMediaAccounts']);
}
Enter fullscreen mode Exit fullscreen mode
Collapse
 
klnjmm profile image
Jimmy Klein β€’ β€’ Edited

In this case, you have to do a intermediate process

$accounts = [];
foreach ($users as $user) {
    $accounts[] = $user['socialMediaAccounts'];
}

$accounts = array_merge([], ...$accounts);
Enter fullscreen mode Exit fullscreen mode
Collapse
 
jfernancordova profile image
JosΓ© CΓ³rdova β€’ β€’ Edited

A fancy way:

$accounts = array_map(static function($user){
    return $user['socialMediaAccounts'];
}, $users);

$accounts = array_merge([], ...$accounts);
Enter fullscreen mode Exit fullscreen mode
Collapse
 
nguyenhai97ict profile image
Nguyα»…n Đăng HαΊ£i β€’

So basically different way of using array_merge so it still array_merge after all :?

Collapse
 
klnjmm profile image
Jimmy Klein β€’

Sorry but I don't understand your comment...

Collapse
 
chris_daniel profile image
Christopher Daniel β€’ β€’ Edited

I think if we pass more than two arrays as arguments, it will call k way merge. It is faster than array_merge in loop

Collapse
 
einenlum profile image
Yann Rabiller β€’

Hi :)

I think you meant in PHP 7.4? wiki.php.net/rfc/spread_operator_f...

Collapse
 
klnjmm profile image
Jimmy Klein β€’

Hi,

No, this work in PHP 5.6 : php.net/manual/en/migration56.new-..., "Argument unpacking via ..." section

Collapse
 
einenlum profile image
Yann Rabiller β€’

Oh! Indeed, array_merge is a function so variadic arguments work… Did not think about it . Thx!

Collapse
 
ohvitorino profile image
Bruno Vitorino β€’

Hi! Nice article.
Could you maybe also add some performance stats comparing both approaches?

Qodo Takeover

Introducing Qodo Gen 1.0: Transform Your Workflow with Agentic AI

Rather than just generating snippets, our agents understand your entire project context, can make decisions, use tools, and carry out tasks autonomously.

Read full post

πŸ‘‹ Kindness is contagious

Please leave a ❀️ or a friendly comment on this post if you found it helpful!

Okay