Слияние двух json

Osik

Новичок
Приветствую, есть 2 json к примеру
PHP:
{
[0] {
    id:22,
    name: Alalala
},
[1] {
    id:23,
    name: olalala
    }
}
И Второй
PHP:
{
[0] {
    id:22,
    price: 2000
},
[1] {
    id:23,
    price: 3000
    }
}
Из общих параметров только id
Вопрос следующий, как из этих двух проучить на выходе 1 примерно такой json исходя из параметра id
PHP:
{
[0] {
    id:22,
    name: Alalala,
    price:2000
},
[1] {
    id:23,
    name: olalala,
    price:3000
    }
}
Без использования циклов,
 

Squats

Новичок
PHP:
var_dump(json_encode(array_merge(json_decode($json1, true), json_decode($json2, true))));
Ну и еще есть интересная функция array_merge_recursive.
 

AmdY

Пью пиво
Команда форума
PHP:
var_dump(json_encode(array_merge(json_decode($json1, true), json_decode($json2, true))));
Ну и еще есть интересная функция array_merge_recursive.
разве это сработает? с чего мержу знать по какому правилу объединять разные структуры?
Без использования циклов,
Используйте циклы и не парьтесь. Можно, конечно, замаскировать цикл за array_reduce, но код от этого станет только хуже. Решение в 3-4 строчки, а вы больше времени потратили на вопрос на форуме.
 

Squats

Новичок
разве это сработает? с чего мержу знать по какому правилу объединять разные структуры?
Я сначала подумал, что ему нужно, просто слить, а ему нужно из 2 сделать 1, без повторов я так понял, по иду, но тут никак без цикла и условия.
 

fixxxer

К.О.
Партнер клуба
Без использования циклов это невозможно, как без использования циклов пройтись по каждому элементу? Какая бы там функция типа array_merge ни была, внутри ее все равно будет цикл.

В данном случае надо мержить по id, потому стандартные функции не подойдут.

Возможно, беспокоят вложенные циклы? Но можно обойтись одним проходом по каждому из массивов, если они оба отсортированы по id. Если нет - ну, отсортировать сначала, все равно это будет намного лучше, чем вложенные циклы.
 

Osik

Новичок
Без использования циклов это невозможно, как без использования циклов пройтись по каждому элементу? Какая бы там функция типа array_merge ни была, внутри ее все равно будет цикл.

В данном случае надо мержить по id, потому стандартные функции не подойдут.

Возможно, беспокоят вложенные циклы? Но можно обойтись одним проходом по каждому из массивов, если они оба отсортированы по id. Если нет - ну, отсортировать сначала, все равно это будет намного лучше, чем вложенные циклы.
А можно примерчик, если не сложно?
 

Squats

Новичок
Да все проще некуда, учи мат часть!

PHP:
$json1 = [
  0 => [
      'id'=>'22',
      'name'=>'Alalalala'
  ],
  1 => [
      'id'=>'23',
      'name'=>'ololololol'
  ]
];

$json2 = [
  0 => [
      'id'=>'22',
      'price'=>'1000'
  ],
  1 => [
      'id'=>'23',
      'price'=>'2000'
  ]
];

$json1 = array_column($json1, null, 'id');
$json2 = array_column($json2, null, 'id');
$json = array_values(array_replace_recursive($json1, $json2));
var_dump($json);
Вывод:

PHP:
array(2) {
  [0]=>
  array(3) {
    ["id"]=>
    string(2) "22"
    ["name"]=>
    string(9) "Alalalala"
    ["price"]=>
    string(4) "1000"
  }
  [1]=>
  array(3) {
    ["id"]=>
    string(2) "23"
    ["name"]=>
    string(10) "ololololol"
    ["price"]=>
    string(4) "2000"
  }
}
 
Сверху