offsetSet($index, $newval) will change an existing cache value or create a new cache entry
<?php
        $cache = new \CachingIterator(
            new \ArrayIterator(['a', 'b', 'c', 'd']),
            \CachingIterator::FULL_CACHE);
        $shortRange = range(0, 1);
        foreach ($shortRange as $index) {
            $cache->next();
        }
        echo PHP_EOL . 'The cache' . PHP_EOL;
        var_export($cache->getCache());
        echo PHP_EOL;
        echo $cache->offsetSet('0', 'manual change') . PHP_EOL;
        echo $cache->offsetSet('3', 'manual entry') . PHP_EOL;
?>
The cache
array (
  0 => 'a',
  1 => 'b',
)
The cache
array (
  0 => 'manual change',
  1 => 'b',
  3 => 'manual entry',
)
There is no requirement that the offset exist in the inner iterator, or that the offset exists in the cache.
<?php
        $cache = new \CachingIterator(
            new \ArrayIterator([]),
            \CachingIterator::FULL_CACHE);
        echo $cache->offsetSet('22', 'manual entry') . PHP_EOL;
        echo PHP_EOL . 'The cache' . PHP_EOL;
        var_export($cache->getCache());
        echo PHP_EOL;
        print_r("cache offset '22' " .
            ($cache->offsetExists('22') == 1
                ? 'exists'
                : "doesn't exist"
            ) . PHP_EOL);
?>
The cache
array (
  22 => 'manual entry',
)
cache offset '22' exists