public static function matches($data, $conditions, $i = null, $length = null) {
		if (!$conditions) {
			return true;
		}
		if (is_string($conditions)) {
			return (boolean) 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;
	}