LoginSignup
2
1

More than 5 years have passed since last update.

連続した数列を範囲形式にまとめたい をPHPで

Last updated at Posted at 2014-02-07

Rubyでどう書く?:連続した数列を範囲形式にまとめたい
をPHPで

簡略化のため入力は最初から配列としています。

<?php

$data = [1, 2, 3, 5, 6, 10, 15, 16, 20];

$ranges = array_reduce($data, function ($current, $element) {
    if (count($current) == 0) {
        $current[] = [$element];

        return $current;
    }

    $currentLastRange = end($current);
    $currentLastNumber = end($currentLastRange);
    if (($currentLastNumber + 1) == $element) {
        if (count($currentLastRange) > 1) {
            array_pop($currentLastRange);
        }
        $currentLastRange[] = $element;
        array_pop($current);
        $current[] = $currentLastRange;
    } else {
        $current[] = [$element];
    }

    return $current;
}, []);

$result = array_reduce($ranges, function ($current, $range) {
    if ($current != '') {
        $current .= ',';
    }
    $current .= implode($range, '-');

    return $current;
}, '');

echo $result;

RubyのEnumerable#injectというのはEnumerable#reduceのエイリアスなんですね(recudeの方がエイリアス?)。勉強になりました。

その2

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1