У меня есть два многомерных массива в PHP, первый из которых
[0] => [
'id' => 123,
'name' => 'John'
],
[1] => [
'id' => 456,
'name' => 'Anna'
],
[2] => [
'id' => 789,
'name' => 'Mario'
]
А второй такой:
[0] => [
'id' => 123,
'position' => 3
],
[1] => [
'id' => 456,
'position' => 1
],
[2] => [
'id' => 789,
'position' => 2
]
Я пытаюсь получить объединение двух массивов без замены какого-либо значения. Я просто хочу добавить «позицию» в первый массив, а также тем временем отсортировать по этому новому значению, например так:
[0] => [
'id' => 456,
'name' => 'Anna',
'position' => 1
],
[1] => [
'id' => 789,
'name' => 'Mario',
'position' => 2
],
[2] => [
'id' => 123,
'name' => 'John',
'position' => 3
]
Как можно достичь этого результата наиболее эффективным способом? Спасибо!
Вы можете создать идентификаторы сопоставления массива с позициями, а затем пропустить первое из имен (или копию) и добавить позиции.
<?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);
Выход:
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,
),
)
Ой простите меня, я не читал сортировку, добавил сортировку поста.
Многие подобные проблемы можно решить всего несколькими строками кода, используя этот внешний класс PHP tableArray.
$result = tableArray::create($names)
->leftJoinOn($positions,'t2','id','id')
->select('id,name,t2.position AS position')
->orderBy('position ASC')
->fetchAll()
;
Спасибо, ваше решение сработало отлично. Мне все еще нужно отсортировать по положению, есть ли способ сделать это во время создания массива или мне нужно отсортировать его после создания?