-1

範囲内の配列要素を取得しようとしていますが、失敗しました。以下に説明します。

$date_array = array('2012-08-02','2012-08-09','2012-08-16','2012-08-23');
$start_date = '2012-08-01';
$end_date   = '2012-08-10';

$start_date と $end_date 内の $date_array から配列要素を取得したいと考えています。つまり、出力は 2012-08-02 および 2012-08-09 になります。

編集:

配列は次のようにすることもできます。

$date_array = array('2012-08-02','2012-08-10','2012-08-16','2012-08-23');
4

2 に答える 2

6

array_filterドキュメントとニーズを満たすコールバックを使用してこれを行うことができます。

$filter = function($start, $end) {
    return function($string) use ($start, $end) {
        return $string >= $start && $string <= $end;
    };
};

$result = array_filter($array, $filter('2012-08-01', '2012-08-10'));

単純な文字列比較で実行できるのはパラメータのみであるため、パラメータの順序に注意してください。また、これらの正確な形式があることにも注意してください。


PHP 5.2との互換性のため、および配列だけでなくイテレータについてもこれを解決するために、より一般的なアプローチを次に示します。

class Range
{
    private $from;
    private $to;
    public function __construct($from, $to) {
        $this->from = $from;
        $this->to = $to;
        if ($from > $to) {
            $this->reverse();
        }
    }
    private function reverse() {
        list($this->from, $this->to) = array($this->to, $this->from);
    }
    public function in($value) {
        return $this->from <= $value && $value <= $this->to;
    }
}

class RangeFilter extends FilterIterator
{
    private $range;
    public function __construct(Iterator $iterator, Range $range) {
        $this->range = $range;
        parent::__construct($iterator);
    }

    public function accept()
    {
        $value = $this->getInnerIterator()->current();
        return $this->range->in($value);
    }
}

$range = new Range($start, $end);
$it = new ArrayIterator($array);
$filtered = new RangeFilter($it, $range);
$result = iterator_to_array($filtered);
于 2012-08-13T12:19:02.807 に答える