Объединение двух многомерных массивов с использованием общего значения массива

У меня есть два массива, в которые я хотел бы присоединиться. Оба массива имеют общее значение key =>, и я хотел бы вставить значения одного массива в другой, чтобы я создал один массив.

Массив 1

 массив
 (
     [0] => Массив
         (
             [ID] => 123456
             [Ключ] => 1000
             [значение] => 123.45
         )

     [1] => Массив
         (
             [ID] => 789012
             [Ключ] => 1001
             [значение] => 56748.17
         )

 )

Массив 2

 массив
 (
     [0] => Массив
         (
             [Ключ] => 1000
             [description] => desc1
         )

     [1] => Массив
         (
             [Ключ] => 1001
             [description] => desc2
         )

Я хотел бы присоединиться к массиву 2 с массивом 1, чтобы получившийся массив был следующим:


 массив
 (
     [0] => Массив
         (
             [ID] => 123456
             [Ключ] => 1000
             [значение] => 123.45
             [description] => desc1
         )

     [1] => Массив
         (
             [ID] => 789012
             [Ключ] => 1001
             [значение] => 56748.17
             [description] => desc2
         )

 ) 

Таким образом, массивы были объединены с использованием значения [Key] в качестве, ну, ключа. Я посмотрел на array_merge и другие функции, но я не могу заставить эти два массива «слить» правильно.

Любая помощь будет оценена по достоинству.

попробуйте это, его линейный

 $keyval = array(); foreach($array1 as $item)$keyval[$item['Key']] = $item['value']; foreach($array2 as $key=>$item)$array2[$key]['description'] = isset($keyval[$item['Key']]) ? $keyval[$item['Key']] : ''; 

Вам нужно было сделать что-то вроде

 $result = array(); foreach ($a1 as $v1) { foreach ($a2 as $k2 => $v2) { if ($v1['Key'] === $v2['Key']) { $result[] = array_merge($v1, $v2); unset($a2[$k2]); break; } } } с $result = array(); foreach ($a1 as $v1) { foreach ($a2 as $k2 => $v2) { if ($v1['Key'] === $v2['Key']) { $result[] = array_merge($v1, $v2); unset($a2[$k2]); break; } } } 

Версия с петлями

 $result = array(); $c_a1 = count($a1); $c_a2 = count($a2); for ($i = 0; $i < $c_a1; $i++) { for ($j = 0; $j < $c_a2; $j++) { if ($a1[$i]['Key'] === $a2[$j]['Key']) { $result[] = array_merge($a1[$i], $a2[$j]); unset($a2[$j]); $c_a2--; break; } } } с $result = array(); $c_a1 = count($a1); $c_a2 = count($a2); for ($i = 0; $i < $c_a1; $i++) { for ($j = 0; $j < $c_a2; $j++) { if ($a1[$i]['Key'] === $a2[$j]['Key']) { $result[] = array_merge($a1[$i], $a2[$j]); unset($a2[$j]); $c_a2--; break; } } } 

Это мой подход:

 $temp_ array = array_fill_keys (array_map(create_function('$a', 'return $a["Key"];'), $array_1) , $array_1); $result = array(); foreach ($array_2 as $item) { if (isset($temp_array[$item['Key']])) { $result[] = array_merge($item, $temp_array[$item['Key']]); } } 

Я разработал больше в коде выше и достиг этой улучшенной версии:

 function array_merge_items_by_common_key_value($key, $array_1, $array_2) { $result = array(); $temp_ array = array_fill_keys(array_map(create_function('$a', 'return $a["' . $key . '"];'), $array_1) , $array_1); foreach ($array_2 as $item) { $result[$item[$key]] = isset($temp_array[$item[$key]]) ? array_merge($item, $temp_array[$item[$key]]) : $item; } return array_values(array_merge($result, array_diff_key($array_1, $result))); } $merged_arrays = array_merge_items_by_common_key_value('Key', $temp_array, $array_2); 

Сначала создается временный массив: он равен $ array_1, но его ключи соответствуют значениям.

Затем $ array_2 зацикливается. Когда совпадение найдено, выполняется слияние. Если совпадение отсутствует, значение $ array_2 сохраняется, нетронутым.

Наконец, те значения в массиве $ array_1, которые не были сопоставлены, также добавляются к результирующему массиву.

Таким образом, ни один элемент $ array_1 или $ array_2 не будет потерян, а совпадающие элементы будут объединены.

Решение @ radashk будет работать, если вы всегда можете гарантировать, что $array1[$i] соответствует $array2[$i] . Из моего чтения вопроса это не гарантируется, но вместо этого вы хотите убедиться, что $array1[$i]['Key'] == $array2[$j]['Key'] и объединить элементы, где эти ключи совпадение.

Там может быть более элегантное решение, но я бы сделал это следующим образом:

  // builds up new $tmpArray, using the Key as the index $tmpArray = array(); foreach($array1 as $innerArray1){ $tmpArray[$innerArray1['Key']] = $innerArray1; } //Merges the values from $array2 into $tmpArray foreach($array2 as $innerArray2) { if (isset($tmpArray[$innerArray2['Key']])) { $tmpArray[$innerArray2['Key']] = array_merge($tmpArray[$innerArray2['Key']], $innerArray2); }else{ $tmpArray[$innerArray2['Key']] = $innerArray2; } }