考虑以下数组$arr_sessions
:
[
{
"url": "2019_7_5_0_52_RACE.json",
"trackName": "road-america"
},
{
"url": "2019_7_5_0_27_RACE.json",
"trackName": "road-america"
},
{
"url": "2019_7_5_0_16_QUALIFY.json",
"trackName": "road-america"
},
{
"url": "2019_7_5_0_0_PRACTICE.json",
"trackName": "road-america"
},
{
"url": "2019_7_4_23_9_RACE.json",
"trackName": "ttassen"
},
{
"url": "2019_7_4_23_52_RACE.json",
"trackName": "ttassen"
},
{
"url": "2019_7_2_11_25_RACE.json",
"trackName": "road-america"
},
{
"url": "2019_7_2_11_03_RACE.json",
"trackName": "road-america"
}
]
基于此数组,我想创建一个新的$arr_results
,如下所示:
[
{
"url": [
"2019_7_5_0_52_RACE.json",
"2019_7_5_0_27_RACE.json",
"2019_7_5_0_16_QUALIFY.json",
"2019_7_5_0_0_PRACTICE.json"
],
"trackName": "road-america"
},
{
"url": [
"2019_7_4_23_9_RACE.json",
"2019_7_4_23_52_RACE.json"
],
"trackName": "ttassen"
},
{
"url": [
"2019_7_2_11_25_RACE.json",
"2019_7_2_11_03_RACE.json"
],
"trackName": "road-america"
}
]
您可以看到,此处的要求是将" url"值组合起来,只要'trackName'与下一个保持相同相同的"读者名称"应该存在于其他地方(例如,在此示例中,我们有2次" Road-America",但是它们不应合并,因为中间有一个不同
到目前为止,我花了大量时间试图弄清楚如何到达那里(我想这必须使用嵌套循环来完成?(
更新
这是我尝试过的1件事(但显然这只会着眼于下一个"读者名称" - 不确定如何从这里继续(
for ($s = 0; $s < count($arr_sessions); $s++) {
$n= $s+1;
if($arr_sessions[$n]["trackName"] == $arr_sessions[$s]["trackName"]){
$arr_results[$s]['name'] = $arr_sessions[$s]["sessionName"];
$arr_results[$s]['log'] = array($arr_sessions[$s]["url"], $arr_sessions[$n]["url"]);
$s += 1;
}
}
不要查看下一个录像机,请将从上一个迭代中的读者保存在变量中。每当它更改时,您都会在结果数组中启动一个新元素。
$arr_results = [];
$prev_trackname = null;
$i = -1;
foreach ($arr_sessions as $current) {
if ($current['trackName'] != $prev_trackname) {
$i++;
$arr_results[$i] = ['trackName' => $current['trackName'], 'url' => []];
$prev_trackname = $current['trackName'];
}
$arr_results[$i]['url'][] = $current['url'];
}
这是一个完整的输出示例。您需要检查曲目名称是否与上一个名称相同,并相应地构建您的数组。
$a = json_decode('[
{
"url": "2019_7_5_0_52_RACE.json",
"trackName": "road-america"
},
{
"url": "2019_7_5_0_27_RACE.json",
"trackName": "road-america"
},
{
"url": "2019_7_5_0_16_QUALIFY.json",
"trackName": "road-america"
},
{
"url": "2019_7_5_0_0_PRACTICE.json",
"trackName": "road-america"
},
{
"url": "2019_7_4_23_9_RACE.json",
"trackName": "ttassen"
},
{
"url": "2019_7_4_23_52_RACE.json",
"trackName": "ttassen"
},
{
"url": "2019_7_2_11_25_RACE.json",
"trackName": "road-america"
},
{
"url": "2019_7_2_11_03_RACE.json",
"trackName": "road-america"
}
]');
// Set previous track to null
$prev_track = NULL;
// New array
$new_a = [];
// Set counter
$i = 0;
foreach ($a as $value) {
// If previous track name is different than current track name
if ($prev_track !== $value->trackName) {
// Increment counter
$i++;
// Create a new array entry
$new_a[$i] = ['trackName' => $value->trackName, 'url' => [$value->url]];
} else {
// Append to previously created array entry
$new_a[$i]['url'][] = $value->url;
}
// Set previous track to current track
$prev_track = $value->trackName;
}
print json_encode(array_values($new_a));
这将输出:
[
{
"trackName": "road-america",
"url": [
"2019_7_5_0_52_RACE.json",
"2019_7_5_0_27_RACE.json",
"2019_7_5_0_16_QUALIFY.json",
"2019_7_5_0_0_PRACTICE.json"
]
},
{
"trackName": "ttassen",
"url": [
"2019_7_4_23_9_RACE.json",
"2019_7_4_23_52_RACE.json"
]
},
{
"trackName": "road-america",
"url": [
"2019_7_2_11_25_RACE.json",
"2019_7_2_11_03_RACE.json"
]
}
]
假设$ arr_sessions实际上是JSON,您可以尝试以下代码:
$output = [];
$data = json_decode($input);
foreach($data as $key=>$value) {
if(isset($output[$value->trackName])) {
array_push($output[$value->trackName]['url'], $value->url);
} else {
$output[$value->trackName] = [
'trackName' => $value->trackName,
'url' => [$value->url]
];
}
}
$your_desired_format = array_values($output);
检查一下:
$lastKey = '';
$index = 0;
$arr = [];
foreach ($arr_sessions as $record) {
$trackName = $record->trackName;
if ($lastKey !== $trackName) {
$lastKey = $trackName;
$index++;
}
if (!$arr[$index]) {
$arr[$index] = (object) [
'trackName' => $lastKey,
'url' => []
];
}
array_push($arr[$index]->url, $record->url);
}
$arr = array_values($arr);
print_r($arr);