4

私は次のような配列を持っています:

Array
(
    [0] => Jan
    [1] => Feb
    [2] => Mar
    [3] => Apr
    [4] => May
    [5] => Jun
    [6] => Sep
    [7] => Oct
    [8] => Dec
)

に変換する必要があります

Array
(
    [0] => "Jan - Jun"
    [1] => "Sep - Oct"
    [2] => "Dec"
)

月は常に順番になりますが、配列は動的であるため、date_parse を使用して各月を数値に変換し、その周りの月と組み合わせる以外に、効率的な方法が思い浮かびません! しかし、これを行う方法について本当に混乱しています。何かアイデアはありますか?

4

2 に答える 2

2

このようなものはどうですか:

function findConsecutiveMonths(array $input) {
    // Utility list of all months
    static $months = array('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
                           'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec');

    $chunks = array();

    for ($i = 0; $i < 12; $i++) {
        // Wait until the $i-th month is contained in the array
        if (!in_array($months[$i], $input)) {
            continue;
        }

        // Find first consecutive month that is NOT contained in the array
        for ($j = $i + 1; $j < 12; $j++) {
            if (!in_array($months[$j], $input)) {
                break;
            }
        }

        // Chunk is from month $i to month $j - 1
        $chunks[] = ($i == $j - 1) ? $months[$i] : $months[$i] .' - '. $months[$j - 1];

        // We know that month $j is not contained in the array so we can set $i
        // to $j - the search for the next chunk is then continued with month
        // $j + 1 because $i is incremented after the following line
        $i = $j;
    }

    return $chunks;
}

デモ: http://codepad.viper-7.com/UfaNfH

于 2013-07-12T13:31:08.857 に答える
0

これはそれを行う必要があります:

function combine_months($months) {
    $all_months = array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");
    $target = array();
    $start = null;
    for ($i = 0; $i<12; $i++) {
        if (!in_array($all_months[$i], $months) && $start != null) {
            if ($start == null) {
                $target[] = $all_months[$i-1];
            }
            else {
                $target[] = sprintf("%s - %s", $start, $all_months[$i-1]);
            }
            $start = null;
        }
        elseif ($start == null) {
            $start = $all_months[$i];
        }
    }
    if ($start != null) {
        $target[] = $start;
    }
    return $target;
}

$test = combine_months(array("Jan","Feb","Mar","Apr","May","Jun","Sep","Oct","Dec"));
var_dump($test);

使用可能なすべての月を反復処理し、最初の共通月を記憶して、月が欠落している場合はターゲット配列に追加します。

于 2013-07-12T12:57:18.280 に答える