<?php 
 
/** 
 * JSONPath implementation for PHP. 
 * 
 * @license https://github.com/SoftCreatR/JSONPath/blob/main/LICENSE  MIT License 
 */ 
 
declare(strict_types=1); 
 
namespace Flow\JSONPath\Filters; 
 
use Flow\JSONPath\{AccessHelper, JSONPathException}; 
 
use function count; 
use function preg_match; 
 
class QueryResultFilter extends AbstractFilter 
{ 
    /** 
     * @inheritDoc 
     * 
     * @throws JSONPathException 
     */ 
    public function filter($collection): array 
    { 
        preg_match('/@\.(?<key>\w+)\s*(?<operator>[-+*\/])\s*(?<numeric>\d+)/', $this->token->value, $matches); 
 
        $matchKey = $matches['key']; 
 
        if (AccessHelper::keyExists($collection, $matchKey, $this->magicIsAllowed)) { 
            $value = AccessHelper::getValue($collection, $matchKey, $this->magicIsAllowed); 
        } elseif ($matches['key'] === 'length') { 
            $value = count($collection); 
        } else { 
            return []; 
        } 
 
        switch ($matches['operator']) { 
            case '+': 
                $resultKey = $value + $matches['numeric']; 
                break; 
            case '*': 
                $resultKey = $value * $matches['numeric']; 
                break; 
            case '-': 
                $resultKey = $value - $matches['numeric']; 
                break; 
            case '/': 
                $resultKey = $value / $matches['numeric']; 
                break; 
            default: 
                throw new JSONPathException('Unsupported operator in expression'); 
        } 
 
        $result = []; 
 
        if (AccessHelper::keyExists($collection, $resultKey, $this->magicIsAllowed)) { 
            $result[] = AccessHelper::getValue($collection, $resultKey, $this->magicIsAllowed); 
        } 
 
        return $result; 
    } 
} 
 
 |