Объединить массив объектов с помощью ключей - PullRequest
0 голосов
/ 06 мая 2020

Я хочу объединить два массива объектов. Приведу пример:

Пример:

// First array:

       $array1 = [
         { name => 'Joe', p_id => 1 },
         { name => 'Bob', p_id => 2 },
         { name => 'Sam', p_id => 4 }
        ]
// Second array:

       $array2 = [
         { id => 1, name => 'X'  },
         { id => 2, name => 'Y'  },
         { id => 4, name => 'Z'  }
        ]

Ожидаемый результат:

 $output = [
  { name => 'Joe + X', id => 1 },
  { name => 'Bob + Y', id => 2 },
  { name => 'Sam + Z', id => 4 }
 ]

Цель:

Мне нужен самый быстрый способ объединить свойство name во втором массиве со свойством name в первом массиве.

Примечание: * Свойство 1021 * в первом массиве такое же, как свойство id во втором массиве.

Что я пробую:

Я использовал вложенные циклы, которые иметь очень низкую скорость.

Ответы [ 2 ]

1 голос
/ 06 мая 2020

array_map - это решение!

Дано:

$first = [
    { name => 'Joe', p_id => 1 },
    { name => 'Bob', p_id => 2 },
    { name => 'Sam', p_id => 4 },
];

$second = [
    { id => 1, name => 'X' },
    { id => 2, name => 'Y' },
    { id => 4, name => 'Z' },
];

Решение просто:

$result = array_map(
    static function (\stdClass $first, \stdClass $second): array {
        return [
            'name' => $first->name . ' + ' . $second->name,
            'id' => $first->p_id,
        ];
    },
    $first, $second
);

PS: Я предполагаю, что объекты \stdClass, замените на правильный.

0 голосов
/ 06 мая 2020

Вот решение, когда идентификаторы элементов внутри массива имеют порядок , а не . Обратите внимание, что я изменил порядок $array1. Чуть лучше, чем обычные вложенные циклы, на l oop из $array2 он удалит «найденные» элементы, чтобы улучшить скорость следующего l oop.

От:

// First array:
$array1 = [
    (object) ['name' => 'Joe', 'p_id' => 1],
    (object) ['name' => 'Sam', 'p_id' => 4],
    (object) ['name' => 'Bob', 'p_id' => 2],
];

// Second array:
$array2 = [
    (object) ['id' => 1, 'name' => 'X'],
    (object) ['id' => 2, 'name' => 'Y'],
    (object) ['id' => 4, 'name' => 'Z'],
];

Решение:

$result = [];
foreach ($array1 as $array1Element) {
  for ($i=0;$i<count($array2);$i++) {
    if ($array1Element->p_id === $array2[$i]->id) {
      $array2[$i]->name = $array1Element->name . ' + ' . $array2[$i]->name;

      $result[] = $array2[$i];
      unset($array2[$i]);
      $array2 = array_values($array2);
      break;
  }
 }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...