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);