これは 2AM コーディングが生成するものですが、機能しているように見えます (おそらくあまり効率的ではありません)。最初の並べ替えのヒントは ajon の功績によるものです。
function mergeYears($data) {
usort($data, function($a, $b) { return $a['start_year'] > $b['start_year']; });
do {
$hasMerges = false;
$size = count($data);
$merged = [];
for($i = 0; $i < $size - 1; $i++) {
if ($data[$i+1]['start_year'] >= $data[$i]['start_year'] && $data[$i+1]['start_year'] < $data[$i]['last_year']) {
if ($data[$i]['last_year'] >= $data[$i+1]) {
$lastYear = $data[$i]['last_year'];
} else {
$lastYear = $data[$i+1]['last_year'];
}
$merged[] = ['start_year' => $data[$i]['start_year'], 'last_year' => $lastYear];
$hasMerges = true;
} else {
$merged[] = $data[$i];
}
}
$data = ($hasMerges) ? $merged : $data;
} while ($hasMerges);
return $data;
}
http://viper-7.com/y7TJH5
編集:簡略化されたコード
function mergeYears($data) {
usort($data, function($a, $b) { return $a['start_year'] > $b['start_year']; });
for($i = 0; $i < count($data) - 1; $i++) {
if ($data[$i+1]['start_year'] >= $data[$i]['start_year'] && $data[$i+1]['start_year'] < $data[$i]['last_year']) {
$lastYearIndex = ($data[$i]['last_year'] >= $data[$i+1]['last_year']) ? $i : $i + 1;
$merged = [
'start_year' => $data[$i]['start_year'],
'last_year' => $data[$lastYearIndex]['last_year']
];
array_splice($data, $i, 2, [$merged]);
$i--;
}
}
return $data;
}
- 最初に start_year で並べ替え
- カウントをループ - 1 アイテム
- 次のアイテムの start_year >= 現在のインデックスの start_year であり、次のアイテムの start_year が現在のインデックスの start_year より小さい場合
- 2 つのアイテムのうち大きい方の last_year を使用して、2 つのアイテムのマージされた配列を作成します。
- array_splice を使用して 2 つのアイテムを削除し、マージされたアイテムに置き換えます
- インデックスを 1 戻して、次のアイテムとマージされた新しい年を確認します
- 新しいマージされた年の配列を返します