Never use array_merge in a loop

chemaclass

Jose Maria Valera Reales

Posted on November 10, 2020

Never use array_merge in a loop

The spread operator to the rescue.

Flattening a one-level array

I have seen people using the array_merge function in a loop like:

$lists = [
  [1, 2],
  [3, 4],
  [5, 6],
];
$merged = [];
foreach($lists as $list) {
    $merged = array_merge($merged, $list);
}
// $merged === [1, 2, 3, 4, 5, 6];
Enter fullscreen mode Exit fullscreen mode

This is a very bad practice because it’s a (memory) performance killer!
Instead, you should use the spread operator (in PHP since 5.6!):

$lists = [
  [1, 2],
  [3, 4],
  [5, 6],
];
$merged = array_merge(...$lists);
// === [1, 2, 3, 4, 5, 6];
Enter fullscreen mode Exit fullscreen mode

Unpacking an assoc-array

What if you had an assoc-array instead like this one?

$lists = [
  'key-1' => [1, 2],
  'key-2' => [3, 4],
  'key-3' => [5, 6],
];
Enter fullscreen mode Exit fullscreen mode

In that case, you will need to unpack its values:

$merged = array_merge(...array_values($lists));
// === [1, 2, 3, 4, 5, 6];
Enter fullscreen mode Exit fullscreen mode

In Functional Programming, this is known as flatting a list.
No loops & no more performance problem.

Flatting a multilevel array

What if you wanted to flat a multilevel array like this one?

$lists = [[1], 2, [[3, 4], 5], [[[]]], [[[6]]], 7, 8, []];
Enter fullscreen mode Exit fullscreen mode

Or like this one, even with key-values?

$lists = [
    'key-1' => [
        1,
        [2],
        'key-2' => [
            3,
            [
                'key-3' => [4, 5],
            ],
        ],
    ],
    6,
    'key-4' => [7, 8],
];
Enter fullscreen mode Exit fullscreen mode

In these cases, you might want to use the internal standard library:

$merged = iterator_to_array(
    new RecursiveIteratorIterator(
        new RecursiveArrayIterator($lists)
    ),
    $use_keys = false
);
// $merged === [1, 2, 3, 4, 5, 6, 7, 8];
Enter fullscreen mode Exit fullscreen mode

Conclusion

Usually, being aware of how to flat a “2 level” array might be sufficient:

$flattenList = array_merge(...array_values($lists));
Enter fullscreen mode Exit fullscreen mode

Otherwise, the internal standard library will help you deal with it.

Alt Text

Originally published on https://chemaclass.es/blog/array-merge-in-loop/

💖 💪 🙅 🚩
chemaclass
Jose Maria Valera Reales

Posted on November 10, 2020

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related

Never use array_merge in a loop
php Never use array_merge in a loop

November 10, 2020