PHP基于密钥重新排序数组



考虑以下数组$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);

相关内容

最新更新