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!
Advertisement
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, ), )