PHP: объединить и отсортировать два многомерных массива с одинаковым значением

У меня есть два многомерных массива в 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 в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
0
84
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете создать идентификаторы сопоставления массива с позициями, а затем пропустить первое из имен (или копию) и добавить позиции.

<?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,
  ),
)

Спасибо, ваше решение сработало отлично. Мне все еще нужно отсортировать по положению, есть ли способ сделать это во время создания массива или мне нужно отсортировать его после создания?

Ghimbo21 13.12.2020 00:25

Ой простите меня, я не читал сортировку, добавил сортировку поста.

Progrock 13.12.2020 00:37

Многие подобные проблемы можно решить всего несколькими строками кода, используя этот внешний класс PHP tableArray.

$result = tableArray::create($names)
  ->leftJoinOn($positions,'t2','id','id')
  ->select('id,name,t2.position AS position')
  ->orderBy('position ASC')
  ->fetchAll()
;

Другие вопросы по теме