Подскажите, как правильно через циклы пересобрать json
у меня есть 4 массива
$id = [2319,2320];
$url = ["/article-type/charter/","/article-type/destination/"];
$match_url = ["/article-type/charter","/article-type/destination"];
$position = [1748,1749];
и json
$json = '
{
"id": 2317,
"url": "/article-type/imperial/",
"match_url": "/article-type/imperial",
"match_data": {
"source": {
"flag_query": "exact",
"flag_case": false,
"flag_trailing": false,
"flag_regex": false
}
},
"action_code": 404,
"action_type": "error",
"action_data": "",
"match_type": "url",
"title": "",
"hits": 0,
"regex": false,
"group_id": 1,
"position": 1746,
"last_access": "-",
"enabled": true
}';
Как я понимаю мы разбираем json в массив через $array = json_decode($json, true);
а как действовать дальше? По хорошему должно получить что-то подобное:
$json = '
{
"id": 2319,
"url": "/article-type/charter/",
"match_url": "/article-type/charter",
"match_data": {
"source": {
"flag_query": "exact",
"flag_case": false,
"flag_trailing": false,
"flag_regex": false
}
},
"action_code": 404,
"action_type": "error",
"action_data": "",
"match_type": "url",
"title": "",
"hits": 0,
"regex": false,
"group_id": 1,
"position": 1748,
"last_access": "-",
"enabled": true
},
{
"id": 2320,
"url": "/article-type/destination/",
"match_url": "/article-type/destination",
"match_data": {
"source": {
"flag_query": "exact",
"flag_case": false,
"flag_trailing": false,
"flag_regex": false
}
},
"action_code": 404,
"action_type": "error",
"action_data": "",
"match_type": "url",
"title": "",
"hits": 0,
"regex": false,
"group_id": 1,
"position": 1749,
"last_access": "-",
"enabled": true
}';
и тд, смотря сколько элементов у нас было в массивах, подскажите как это можно реализовать пожалуйста
Ответы (4 шт):
$id = [2319,2320];
$url = ["/article-type/charter/","/article-type/destination/"];
$match_url = ["/article-type/charter","/article-type/destination"];
$position = [1748,1749];
$newArray = Array();
foreach($array as $k=>$v){
$data = new stdClass();
$data->id = $id[$k];
$data->url = $url[$url];
$data->match_url = $url[$match_url];
$data->position = $url[$position];
// other
$newArray[] = $data;
}
$json = json_encode($newArray);
Писал прямо сюда, могут быть ошибки
Если у вас есть базовый Json, в который надо подставлять значения из массивов array_map и array_merge вам в помощь.
ваши исходные:
$json = '{"a":1,"url":"http://google.com"}';
$data = json_decode($json, true);
$id = [2319,2320];
$url = ["/article-type/charter/","/article-type/destination/"];
$match_url = ["/article-type/charter","/article-type/destination"];
$position = [1748,1749];
дальше ходите по массивам сливая их с начальным.
$result = array_map(function($id, $url, $match, $pos) use ($data){
return array_merge($data, [
'id' => $id,
'url' => $url,
'match_url' => $match,
'position' => $pos]);
}, $id, $url, $match_url, $position);
можете array_combine еще приделать
$result = array_map(function(...$values) use ($data){
return array_merge($data,
array_combine(['id', 'url'....], $values));
}, $id, $url, $match_url, $position);
Если id в списке $id совпадает с данными в json, то перезапишутся новые данные под этим id.
Если нет, то будут добавляться данные в соответствии с примером:
<?php
$id = [2319,2320];
$url = ["/article-type/charter/","/article-type/destination/"];
$match_url = ["/article-type/charter","/article-type/destination"];
$position = [1748,1749];
$json = '{
"id": 2317,
"url": "/article-type/imperial/",
"match_url": "/article-type/imperial",
"match_data": {
"source": {
"flag_query": "exact",
"flag_case": false,
"flag_trailing": false,
"flag_regex": false
}
},
"action_code": 404,
"action_type": "error",
"action_data": "",
"match_type": "url",
"title": "",
"hits": 0,
"regex": false,
"group_id": 1,
"position": 1746,
"last_access": "-",
"enabled": true
}';
$array = json_decode($json, true);
$array1[] = $array;
foreach ($id as $key=>$item){
$trig = 0;
foreach ($array1 as $key1=>$item1) {
if ($item == $item1['id']) {
$trig = 0;
$tempArr = $array1[$key1];
$tempArr['id'] = $item;
$tempArr['url'] = $url[$key];
$tempArr['match_url'] = $match_url[$key];
$tempArr['position'] = $position[$key];
$array1[$key1] = $tempArr;
} else {
$trig = 1;
}
}
if($trig == 1){
$tempArr = $array1[0];
$tempArr['id'] = $item;
$tempArr['url'] = $url[$key];
$tempArr['match_url'] = $match_url[$key];
$tempArr['position'] = $position[$key];
$array1[] = $tempArr;
}
}
print_r($array1);
Всем спасибо за подсказки, в итоге сделала вот так:
$array = [];
foreach($id as $index => $value) {
$array[] = [
'id' => $value,
'url' => $url[$index],
'match_url' => $match_url[$index],
'match_data' => [
'source' => [
'flag_query' => 'exact',
'flag_case' => false,
'flag_trailing' => false,
'flag_regex' => false
]
],
'action_code' => 404,
'action_type' => 'error',
'action_data' => '',
'match_type' => 'url',
'title' => '',
'hits' => 0,
'regex' => false,
'group_id' => 1,
'position' => $position[$index],
'last_access' => '-',
'enabled' => true
];
}
$json = json_encode($array);