public static function matches($data, $conditions, $i = null, $length = null)
{
if (!$conditions) {
return true;
}
if (is_string($conditions)) {
return (bool) static::extract($data, $conditions);
}
foreach ($conditions as $condition) {
if ($condition === ':last') {
if ($i !== $length) {
return false;
}
continue;
} elseif ($condition === ':first') {
if ($i !== 1) {
return false;
}
continue;
}
if (!preg_match('/(.+?)([><!]?[=]|[><])(.*)/', $condition, $match)) {
if (ctype_digit($condition)) {
if ($i !== (int) $condition) {
return false;
}
} elseif (preg_match_all('/(?:^[0-9]+|(?<=,)[0-9]+)/', $condition, $matches)) {
return in_array($i, $matches[0]);
} elseif (!isset($data[$condition])) {
return false;
}
continue;
}
list(, $key, $op, $expected) = $match;
if (!isset($data[$key])) {
return false;
}
$val = $data[$key];
if ($op === '=' && $expected && $expected[0] === '/') {
return preg_match($expected, $val);
} elseif ($op === '=' && $val != $expected) {
return false;
} elseif ($op === '!=' && $val == $expected) {
return false;
} elseif ($op === '>' && $val <= $expected) {
return false;
} elseif ($op === '<' && $val >= $expected) {
return false;
} elseif ($op === '<=' && $val > $expected) {
return false;
} elseif ($op === '>=' && $val < $expected) {
return false;
}
}
return true;
}