PHP массив слияния по внутренним ключам

У меня есть два массива, как:

$a = [
0 => [
'price' => 5.5
],
1 => [
'price' => 6.0
],
2 => [
'price' => 6.2
],
3 => [
'price' => 6.5
],
];

$b = [
0 => [
'color' => 'RED'
],
1 => [
'color' => 'WHITE'
],
2 => [
'color' => 'BLUE'
],
3 => [
'color' => 'RED'
],
];

У меня должен быть такой ответ:

Array
(
[0] => Array
(
[price] => 5.5
[color] => RED
)
[1] => Array
(
[price] => 6
[color] => WHITE
)
[2] => Array
(
[price] => 6.2
[color] => BLUE
)
[3] => Array
(
[price] => 6.5
[color] => RED
)
)

Я слышал о функции: array_merge_recursive, но ответ не был востребованным:

Array
(
[0] => Array
(
[price] => 5.5
)
[1] => Array
(
[price] => 6
)
[2] => Array
(
[price] => 6.2
)
[3] => Array
(
[price] => 6.5
)
[4] => Array
(
[color] => RED
)
[5] => Array
(
[color] => WHITE
)

[6] => Array
(
[color] => BLUE
)
[7] => Array
(
[color] => RED
)
)

поэтому я решил написать свою собственную функцию:

function merge ($a, $b) {
$keys = array_keys($a);
foreach ($keys as $value) {
if (isset($b[$value])) {
$tmp = array_keys($b[$value]);
foreach ($tmp as $val){
$a[$value][$val] = $b[$value][$val];
}
}
}
return $a;
}
print_r(merge($a, $b));

и я получил правильный ответ:

Array
(
[0] => Array
(
[price] => 5.5
[color] => RED
)
[1] => Array
(
[price] => 6
[color] => WHITE
)
[2] => Array
(
[price] => 6.2
[color] => BLUE
)
[3] => Array
(
[price] => 6.5
[color] => RED
)
)

Проблема в том, что он хорошо работает для маленьких массивов, но не работает хорошо для больших массивов, поэтому мой вопрос: как я могу оптимизировать функцию? потому что сложность будет расти в зависимости от объединенных ключей.

Использование PHP 7.0

0

Решение

Ты можешь использовать array_replace_recursive () вместо.

array_replace_recursive($a, $b);

Демо-версия: https://3v4l.org/bFIZ2

4

Другие решения

Вы должны проверить, что они имеют одинаковую длину, а затем один простой foreach это все что нужно:

foreach($a as $k => $v) {
$result[$k] = array_merge($v, $b[$k]);
}
4

простое решение может быть,

$c = [];

for($i=0; $i<count(array_keys($a)); $i++) {
$c[$i] =array_merge($a[$i], $b[$i]);
}

print_r($c);

https://repl.it/KJNL

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector