У меня есть два массива, в которые я хотел бы присоединиться. Оба массива имеют общее значение 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; } }