Hi Pierre Right now, it returns the value of a given position. In that case, array_get_pos might be a better name. Oh, and I attached the patch with .txt extension :)
Greetings, Felix
Index: ext/standard/array.c =================================================================== --- ext/standard/array.c (revision 296276) +++ ext/standard/array.c (working copy) @@ -4507,6 +4507,41 @@ } /* }}} */ +/* {{{ proto array array_seek(array input, int position) + Finds the array value which matches the position of that element */ +PHP_FUNCTION(array_seek) +{ + int num_in; + int currentpos = 0; + long pos; + zval *array, **entry; + HashPosition hpos; + + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "al", &array, &pos) == FAILURE) { + return; + } + + /* Get number of entries in the array */ + num_in = zend_hash_num_elements(Z_ARRVAL_P(array)); + + /* Check if we have a valid position. */ + if (pos > num_in - 1 || pos < 0) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Seek position %ld is out of range", pos); + return; + } + + /* Loop over the input array untill we are at the right position */ + zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(array), &hpos); + while (currentpos <= pos && zend_hash_get_current_data_ex(Z_ARRVAL_P(array), (void **)&entry, &hpos) == SUCCESS) { + currentpos++; + zend_hash_move_forward_ex(Z_ARRVAL_P(array), &hpos); + } + + /* Return the matching element */ + RETURN_ZVAL(*entry, 1, 0); +} +/* }}} */ + /* * Local variables: * tab-width: 4 Index: ext/standard/basic_functions.c =================================================================== --- ext/standard/basic_functions.c (revision 296276) +++ ext/standard/basic_functions.c (working copy) @@ -609,6 +609,11 @@ ZEND_ARG_INFO(0, keys) /* ARRAY_INFO(0, keys, 0) */ ZEND_ARG_INFO(0, values) /* ARRAY_INFO(0, values, 0) */ ZEND_END_ARG_INFO() + +ZEND_BEGIN_ARG_INFO(arginfo_array_seek, 0) + ZEND_ARG_INFO(0, input) /* ARRAY_INFO(0, input, 0) */ + ZEND_ARG_INFO(0, position) /* ARRAY_INFO(0, position, 0) */ +ZEND_END_ARG_INFO() /* }}} */ /* {{{ basic_functions.c */ ZEND_BEGIN_ARG_INFO(arginfo_get_magic_quotes_gpc, 0) @@ -3320,6 +3325,7 @@ PHP_FE(array_chunk, arginfo_array_chunk) PHP_FE(array_combine, arginfo_array_combine) PHP_FE(array_key_exists, arginfo_array_key_exists) + PHP_FE(array_seek, arginfo_array_seek) /* aliases from array.c */ PHP_FALIAS(pos, current, arginfo_current) Index: ext/standard/php_array.h =================================================================== --- ext/standard/php_array.h (revision 296276) +++ ext/standard/php_array.h (working copy) @@ -101,6 +101,7 @@ PHP_FUNCTION(array_key_exists); PHP_FUNCTION(array_chunk); PHP_FUNCTION(array_combine); +PHP_FUNCTION(array_seek); PHPAPI HashTable* php_splice(HashTable *, int, int, zval ***, int, HashTable **); PHPAPI int php_array_merge(HashTable *dest, HashTable *src, int recursive TSRMLS_DC);
On 16-mrt-2010, at 14:34, Pierre Joye wrote: > hi Felix, > > Not sure about the usefulness of this function but the name is > misleading (pls reattach the patch as .txt while being at it :). Does > it set the position (_seek) or does it return the value of a given > position (_get_pos)? or both (no idea :)? > > Cheers, > > Cheers, > > On Tue, Mar 16, 2010 at 2:30 PM, Felix De Vliegher > <felix.devlieg...@gmail.com> wrote: >> Hi all >> >> I recently needed seek functionality in arrays, and couldn't find it in the >> regular set of array functions, so I wrote a function for it. (Seek = >> getting an array value based on the position (or offset, if you want to call >> it like that), and not the key of the item) >> >> Basically you can use it like this: >> $input = array(3, 'bar', 'baz'); >> echo array_seek($input, 2); // returns 'baz' >> echo array_seek($input, 0); // returns 3 >> echo array_seek($input, 5); // returns NULL, emits an out of range warning >> >> I was wondering if it's useful to add this to the family of array functions. >> I know there is a somewhat similar thing in SPL (ArrayIterator::seek), but >> that doesn't work exactly like what I was aiming for. >> >> Attached is a patch for the function against the 5.3 branch. If approved, I >> could add it to svn + testcases + docs. Feedback please :-) >> >> >> Kind regards, >> Felix >> >> >> >> -- >> PHP Internals - PHP Runtime Development Mailing List >> To unsubscribe, visit: http://www.php.net/unsub.php >> > > > > -- > Pierre > > @pierrejoye | http://blog.thepimp.net | http://www.libgd.org
-- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php