设置内部数组指针而不在PHP中迭代

Pet*_*ter 13 php arrays

是否可以在不首先遍历数组的情况下设置PHP的内部数组指针.以下面的虚拟代码为例:

$array = range(1, 100);

// Represents the array key
$pointer = 66;

set_array_pointer($pointer, $array);

$nextValue = next($array); // Should return 68
Run Code Online (Sandbox Code Playgroud)

Lib*_*aul 10

你可以用ArrayObjectArrayIterator:

$array = range(1, 100);
$pointer = 66;

$arrayobject = new ArrayObject($array);
$iterator = $arrayobject->getIterator();
$iterator->seek($pointer);     //set position
$iterator->next();             // move iterator
$nextValue = $iterator->current();
Run Code Online (Sandbox Code Playgroud)


Joj*_*ojo 9

LibertyPaul使用ArrayIterator :: seek提供的解决方案似乎是使php设置指向数组中位置的指针而不在userland中初始化循环的唯一方法.php将在内部循环遍历数组以设置指针,但是,您可以从ArrayIterator :: seek()的php 读取:

/* {{{ proto void ArrayIterator::seek(int $position)
   Seek to position. */
SPL_METHOD(Array, seek)
{
    zend_long opos, position;
    zval *object = getThis();
    spl_array_object *intern = Z_SPLARRAY_P(object);
    HashTable *aht = spl_array_get_hash_table(intern);
    int result;

    if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &position) == FAILURE) {
        return;
    }

    if (!aht) {
        php_error_docref(NULL, E_NOTICE, "Array was modified outside object and is no longer an array");
        return;
    }

    opos = position;

    if (position >= 0) { /* negative values are not supported */
        spl_array_rewind(intern);
        result = SUCCESS;

        while (position-- > 0 && (result = spl_array_next(intern)) == SUCCESS);

        if (result == SUCCESS && zend_hash_has_more_elements_ex(aht, spl_array_get_pos_ptr(aht, intern)) == SUCCESS) {
            return; /* ok */
        }
    }
    zend_throw_exception_ex(spl_ce_OutOfBoundsException, 0, "Seek position %pd is out of range", opos);
} /* }}} */
Run Code Online (Sandbox Code Playgroud)

所以看起来没有办法将数组指针设置到某个位置而不循环遍历数组