| 
<?phpdeclare(strict_types=1);
 namespace ParagonIE\Ionizer\Filter;
 
 use ParagonIE\Ionizer\Contract\FilterInterface;
 use ParagonIE\Ionizer\InvalidDataException;
 use ParagonIE\Ionizer\Util;
 
 /**
 * Class StrictArrayFilter
 * @package ParagonIE\Ionizer\Filter
 */
 class StrictArrayFilter extends ArrayFilter implements FilterInterface
 {
 /** @var string */
 protected $keyType;
 
 /** @var string */
 protected $valueType;
 
 public function __construct(string $keyType, string $valueType)
 {
 if (!\in_array($keyType, ['int', 'string'], true)) {
 throw new \RuntimeException('Cannot accept key types other than "int" or "string".');
 }
 $this->keyType = $keyType;
 $this->valueType = $valueType;
 }
 
 /**
 * Apply all of the callbacks for this filter.
 *
 * @param mixed|null $data
 * @param int $offset
 * @return mixed
 * @throws \TypeError
 * @throws InvalidDataException
 */
 public function applyCallbacks($data = null, int $offset = 0)
 {
 if ($offset === 0) {
 if (\is_null($data)) {
 return parent::applyCallbacks([], 0);
 } elseif (!\is_array($data)) {
 throw new \TypeError(
 \sprintf('Expected an array (%s).', $this->index)
 );
 }
 $data = (array) $data;
 /**
 * @var array<mixed, mixed> $data
 * @var string|int|float|bool|array|null $value
 */
 foreach ($data as $key => $value) {
 $keyType = Util::getType($key);
 $valType = Util::getType($value);
 if ($keyType !== $this->keyType || $valType !== $this->valueType) {
 throw new \TypeError(
 \sprintf(
 'Expected an array<%s, %s>. At least one element of <%s, %s> was found (%s[%s] == %s).',
 $this->keyType,
 $this->valueType,
 $keyType,
 $valType,
 $this->index,
 \json_encode($key),
 \json_encode($value)
 )
 );
 }
 }
 
 return parent::applyCallbacks($data, 0);
 }
 return parent::applyCallbacks($data, $offset);
 }
 }
 
 |