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

  • Автор темы Автор темы Osik
  • Дата начала Дата начала

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
    }
}
Без использования циклов,
 
PHP:
var_dump(json_encode(array_merge(json_decode($json1, true), json_decode($json2, true))));

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

Ну и еще есть интересная функция array_merge_recursive.
разве это сработает? с чего мержу знать по какому правилу объединять разные структуры?
Без использования циклов,
Используйте циклы и не парьтесь. Можно, конечно, замаскировать цикл за array_reduce, но код от этого станет только хуже. Решение в 3-4 строчки, а вы больше времени потратили на вопрос на форуме.
 
разве это сработает? с чего мержу знать по какому правилу объединять разные структуры?
Я сначала подумал, что ему нужно, просто слить, а ему нужно из 2 сделать 1, без повторов я так понял, по иду, но тут никак без цикла и условия.
 
Без использования циклов это невозможно, как без использования циклов пройтись по каждому элементу? Какая бы там функция типа array_merge ни была, внутри ее все равно будет цикл.

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

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

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

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

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"
  }
}
 
Сверху