0

次のような配列がある場合:

Array
(
    [0] => Array
        (
            [last_year] => 2006
            [start_year] => 2000
        )

    [1] => Array
        (
            [last_year] => 2008
            [start_year] => 2001
        )

    [2] => Array
        (
            [last_year] => 1998
            [start_year] => 1997
        )
)

配列インデックスを比較してマージlast_yearstart_year、それらが互いに含まれている方法はありますか? たとえば、処理後の上記の配列は次のようになります。

Array
(
    [0] => Array
        (
            [last_year] => 2008
            [start_year] => 2000
        )

    [1] => Array
        (
            [last_year] => 1998
            [start_year] => 1997
        )
)
4

2 に答える 2

1

私が考えることができる最良の方法は次のとおりです。

1)  sort this outer array by start_year.
2)  iterate over the outer array.
  a) If it overlaps with the next array if cur[last_year]>=next[start_year] Then
    set cur[last_year]=next[last_year]
  b) if it doesn't then cur = next and next is get next array.

これはテストされておらず、私はしばらくの間PHPを実行していません。

// You can sort this array however you want, just sort by start_year.
$sortedArray = arr.sort();
$curIndx = 0;
for (int $i=1;$i<len($sortedArray);$i++){
   if ($sortedArray[$curIndx][last_year]>=$sortedArray[$i][start_year]){
      if (sortedArray[$i][last_year]>=sortedArray[$curIndex][last_year]){
          sortedArray[$curIndex][last_year] = sortedArray[$i][last_year];
      }
      unset(sortedArray[$i]);
   } else {
      $curIndx = $i;
   }
}
于 2012-08-31T08:16:08.867 に答える
0

これは 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;
}
  1. 最初に start_year で並べ替え
  2. カウントをループ - 1 アイテム
  3. 次のアイテムの start_year >= 現在のインデックスの start_year であり、次のアイテムの start_year が現在のインデックスの start_year より小さい場合
    • 2 つのアイテムのうち大きい方の last_year を使用して、2 つのアイテムのマージされた配列を作成します。
    • array_splice を使用して 2 つのアイテムを削除し、マージされたアイテムに置き換えます
    • インデックスを 1 戻して、次のアイテムとマージされた新しい年を確認します
  4. 新しいマージされた年の配列を返します
于 2012-08-31T08:56:43.030 に答える