是否可以在不首先遍历数组的情况下设置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
你可以用ArrayObject和ArrayIterator:
$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)
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)
所以看起来没有办法将数组指针设置到某个位置而不循环遍历数组