PHP: Combine and sort two multidimensional arrays with same value

Tags: , , ,



I have two multidimensional arrays in PHP, the first one being

[0] => [
'id' => 123,
'name' => 'John'
],

[1] => [
'id' => 456,
'name' => 'Anna'
],

[2] => [
'id' => 789,
'name' => 'Mario'
]

And the second one is like this:

[0] => [
'id' => 123,
'position' => 3
],

[1] => [
'id' => 456,
'position' => 1
],

[2] => [
'id' => 789,
'position' => 2
]

I’m trying to get a union of the two arrays without replacing any value. I just want to add ‘position’ to the first array and also sort by this new value in the meantime, like this:

[0] => [
'id' => 456,
'name' => 'Anna',
'position' => 1
],

[1] => [
'id' => 789,
'name' => 'Mario',
'position' => 2
],

[2] => [
'id' => 123,
'name' => 'John',
'position' => 3
]

How can achieve this result in the most efficient way? Thank you!

Answer

You can build an array mapping ids to positions, and then loop through the a first of names (or a copy), and add the positions.

<?php
$names =
[
    [
        'id' => 123,
        'name' => 'John'
    ],
    [
        'id' => 456,
        'name' => 'Anna'
    ],
    [
        'id' => 789,
        'name' => 'Mario'
    ]
];

$positions =
[
    [
        'id' => 123,
        'position' => 3
    ],
    [
        'id' => 456,
        'position' => 1
    ],
    [
        'id' => 789,
        'position' => 2
    ]
];
$id_positions = array_column($positions, 'position', 'id');
$result = $names;
foreach($result as &$item) {
    $item['position'] = $id_positions[$item['id']] ?? null;
}
unset($item);

uasort($result, function($a, $b) { return $a['position'] <=> $b['position']; });
var_export($result);

Output:

array (
  0 => 
  array (
    'id' => 456,
    'name' => 'Anna',
    'position' => 1,
  ),
  1 => 
  array (
    'id' => 789,
    'name' => 'Mario',
    'position' => 2,
  ),
  2 => 
  array (
    'id' => 123,
    'name' => 'John',
    'position' => 3,
  ),
)


Source: stackoverflow