<?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; 
 
use function count; 
 
class SliceFilter extends AbstractFilter 
{ 
    /** 
     * @inheritDoc 
     */ 
    public function filter($collection): array 
    { 
        $length = count($collection); 
        $start = $this->token->value['start']; 
        $end = $this->token->value['end']; 
        $step = $this->token->value['step'] ?: 1; 
 
        if ($start === null) { 
            $start = 0; 
        } 
 
        if ($start < 0) { 
            $start = $length + $start; 
            if ($start < 0) { 
                $start = 0; 
            } 
        } 
 
        if ($end === null) { 
            // negative index start means the end is -1, else the end is the last index 
            $end = $length; 
        } 
 
        if ($end < 0) { 
            $end = $length + $end; 
        } 
 
        $result = []; 
 
        for ($i = $start; $i < $end; $i += $step) { 
            $index = $i; 
 
            if ($i < 0) { 
                $index = $length + $i; 
            } 
 
            if (AccessHelper::keyExists($collection, $index, $this->magicIsAllowed)) { 
                $result[] = $collection[$index]; 
            } 
        } 
 
        return $result; 
    } 
} 
 
 |