Re[2]: [PHP-DEV] array_has_more
| From: | (Marcus B�rger) | Date: | Fri, 04 Jul 2003 17:00:36 +0000 |
| Subject: | Re[2]: [PHP-DEV] array_has_more | ||
| References: | 1 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-3244@lists.php.net to get a copy of this message | ||
Hello Andi,
damn, yeah, it was already to early in the morning when i sent the mail, i
somehow didn't notice that i was trying to send a '.tx' file :-(
Friday, July 4, 2003, 11:55:01 AM, you wrote:
AG> You forgot to attach the diff :)
AG> Andi
AG> At 03:56 AM 4/7/2003 +0200, Marcus Börger wrote:
>>Hello internals,
>>
>> during my todays work i was again reminded that still one array function is
>>missing namely array_has_more. This function will return true if there are
>>more elements in an array and false if not. The real problem is that next()
>>doesn't work with false.
>>
>>A diff against PHP 5 is attached. If noone objects i'll commit this later on
>>friday.
>>
>>Examle:
>><?php
>>
>>$ar = array(2,1,false,0);
>>$i = 0;
>>
>>function show() {
>> global $ar, $i;
>>
>> echo "loop: ";var_dump($i++);
>> echo "curr: ";var_dump(current($ar));
>> echo "more: ";var_dump(array_has_more($ar));
>> echo "curr: ";var_dump(current($ar));
>> echo "next: ";var_dump(next($ar));
>> echo "\n";
>>}
>>
>>show();
>>show();
>>show();
>>show();
>>show();
>>show();
>>
>>?>
>>
>>--
>>Best regards,
>> Marcus mailto:helly@php.net
>>--
>>PHP Internals - PHP Runtime Development Mailing List
>>To unsubscribe, visit: http://www.php.net/unsub.php
--
Best regards,
Marcus mailto:helly@php.net
Index: ext/standard/basic_functions.c =================================================================== RCS file: /repository/php-src/ext/standard/basic_functions.c,v retrieving revision 1.616 diff -u -p -r1.616 basic_functions.c --- ext/standard/basic_functions.c 28 Jun 2003 05:38:52 -0000 1.616 +++ ext/standard/basic_functions.c 4 Jul 2003 01:52:24 -0000 @@ -839,6 +839,7 @@ function_entry basic_functions[] = { PHP_FE(next, first_arg_force_ref) PHP_FE(reset, first_arg_force_ref) PHP_FE(current, first_arg_force_ref) + PHP_FE(array_has_more, first_arg_force_ref) PHP_FE(key, first_arg_force_ref) PHP_FE(min, NULL) PHP_FE(max, NULL) Index: ext/standard/php_array.h =================================================================== RCS file: /repository/php-src/ext/standard/php_array.h,v retrieving revision 1.43 diff -u -p -r1.43 php_array.h --- ext/standard/php_array.h 10 Jun 2003 20:03:38 -0000 1.43 +++ ext/standard/php_array.h 4 Jul 2003 01:52:24 -0000 @@ -85,6 +85,7 @@ PHP_FUNCTION(array_map); PHP_FUNCTION(array_key_exists); PHP_FUNCTION(array_chunk); PHP_FUNCTION(array_combine); +PHP_FUNCTION(array_has_more); HashTable* php_splice(HashTable *, int, int, zval ***, int, HashTable **); PHPAPI int php_array_merge(HashTable *dest, HashTable *src, int recursive TSRMLS_DC); Index: ext/standard/array.c =================================================================== RCS file: /repository/php-src/ext/standard/array.c,v retrieving revision 1.234 diff -u -p -r1.234 array.c --- ext/standard/array.c 16 Jun 2003 17:35:16 -0000 1.234 +++ ext/standard/array.c 4 Jul 2003 01:52:25 -0000 @@ -3781,6 +3781,29 @@ PHP_FUNCTION(array_combine) } /* }}} */ +/* {{{ proto boolean array_has_more(array array_arg) + * */ +PHP_FUNCTION(array_has_more) +{ + pval **array; + HashTable *target_hash; + + if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &array) == FAILURE) { + WRONG_PARAM_COUNT; + } + target_hash = HASH_OF(*array); + if (!target_hash) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Passed variable is not an array or object"); + RETURN_FALSE; + } + if (zend_hash_has_more_elements(target_hash) == SUCCESS) { + RETURN_TRUE; + } else { + RETURN_FALSE; + } +} +/* }}} */ + /* * Local variables: * tab-width: 4 Index: Zend/zend_hash.c =================================================================== RCS file: /repository/ZendEngine2/zend_hash.c,v retrieving revision 1.102 diff -u -p -r1.102 zend_hash.c --- Zend/zend_hash.c 14 Jun 2003 11:32:30 -0000 1.102 +++ Zend/zend_hash.c 4 Jul 2003 01:52:26 -0000 @@ -1005,6 +1005,20 @@ ZEND_API void zend_hash_internal_pointer } +ZEND_API int zend_hash_has_more_elements_ex(HashTable *ht, HashPosition *pos) +{ + HashPosition *current = pos ? pos : &ht->pInternalPointer; + + IS_CONSISTENT(ht); + + if (*current && (*current)->pListNext) { + return SUCCESS; + } else { + return FAILURE; + } +} + + ZEND_API int zend_hash_move_forward_ex(HashTable *ht, HashPosition *pos) { HashPosition *current = pos ? pos : &ht->pInternalPointer; Index: Zend/zend_hash.h =================================================================== RCS file: /repository/ZendEngine2/zend_hash.h,v retrieving revision 1.67 diff -u -p -r1.67 zend_hash.h --- Zend/zend_hash.h 10 Jun 2003 20:03:25 -0000 1.67 +++ Zend/zend_hash.h 4 Jul 2003 01:52:26 -0000 @@ -164,6 +164,7 @@ ZEND_API int zend_hash_index_exists(Hash ZEND_API ulong zend_hash_next_free_element(HashTable *ht); /* traversing */ +ZEND_API int zend_hash_has_more_elements_ex(HashTable *ht, HashPosition *pos); ZEND_API int zend_hash_move_forward_ex(HashTable *ht, HashPosition *pos); ZEND_API int zend_hash_move_backwards_ex(HashTable *ht, HashPosition *pos); ZEND_API int zend_hash_get_current_key_ex(HashTable *ht, char **str_index, uint *str_length, ulong *num_index, zend_bool duplicate, HashPosition *pos); @@ -172,6 +173,8 @@ ZEND_API int zend_hash_get_current_data_ ZEND_API void zend_hash_internal_pointer_reset_ex(HashTable *ht, HashPosition *pos); ZEND_API void zend_hash_internal_pointer_end_ex(HashTable *ht, HashPosition *pos); +#define zend_hash_has_more_elements(ht) \ + zend_hash_has_more_elements_ex(ht, NULL) #define zend_hash_move_forward(ht) \ zend_hash_move_forward_ex(ht, NULL) #define zend_hash_move_backwards(ht) \
Index: ext/standard/basic_functions.c =================================================================== RCS file: /repository/php-src/ext/standard/basic_functions.c,v retrieving revision 1.616 diff -u -p -r1.616 basic_functions.c --- ext/standard/basic_functions.c 28 Jun 2003 05:38:52 -0000 1.616 +++ ext/standard/basic_functions.c 4 Jul 2003 01:52:24 -0000 @@ -839,6 +839,7 @@ function_entry basic_functions[] = { PHP_FE(next, first_arg_force_ref) PHP_FE(reset, first_arg_force_ref) PHP_FE(current, first_arg_force_ref) + PHP_FE(array_has_more, first_arg_force_ref) PHP_FE(key, first_arg_force_ref) PHP_FE(min, NULL) PHP_FE(max, NULL) Index: ext/standard/php_array.h =================================================================== RCS file: /repository/php-src/ext/standard/php_array.h,v retrieving revision 1.43 diff -u -p -r1.43 php_array.h --- ext/standard/php_array.h 10 Jun 2003 20:03:38 -0000 1.43 +++ ext/standard/php_array.h 4 Jul 2003 01:52:24 -0000 @@ -85,6 +85,7 @@ PHP_FUNCTION(array_map); PHP_FUNCTION(array_key_exists); PHP_FUNCTION(array_chunk); PHP_FUNCTION(array_combine); +PHP_FUNCTION(array_has_more); HashTable* php_splice(HashTable *, int, int, zval ***, int, HashTable **); PHPAPI int php_array_merge(HashTable *dest, HashTable *src, int recursive TSRMLS_DC); Index: ext/standard/array.c =================================================================== RCS file: /repository/php-src/ext/standard/array.c,v retrieving revision 1.234 diff -u -p -r1.234 array.c --- ext/standard/array.c 16 Jun 2003 17:35:16 -0000 1.234 +++ ext/standard/array.c 4 Jul 2003 01:52:25 -0000 @@ -3781,6 +3781,29 @@ PHP_FUNCTION(array_combine) } /* }}} */ +/* {{{ proto boolean array_has_more(array array_arg) + * */ +PHP_FUNCTION(array_has_more) +{ + pval **array; + HashTable *target_hash; + + if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &array) == FAILURE) { + WRONG_PARAM_COUNT; + } + target_hash = HASH_OF(*array); + if (!target_hash) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Passed variable is not an array or object"); + RETURN_FALSE; + } + if (zend_hash_has_more_elements(target_hash) == SUCCESS) { + RETURN_TRUE; + } else { + RETURN_FALSE; + } +} +/* }}} */ + /* * Local variables: * tab-width: 4 Index: Zend/zend_hash.c =================================================================== RCS file: /repository/ZendEngine2/zend_hash.c,v retrieving revision 1.102 diff -u -p -r1.102 zend_hash.c --- Zend/zend_hash.c 14 Jun 2003 11:32:30 -0000 1.102 +++ Zend/zend_hash.c 4 Jul 2003 01:52:26 -0000 @@ -1005,6 +1005,20 @@ ZEND_API void zend_hash_internal_pointer } +ZEND_API int zend_hash_has_more_elements_ex(HashTable *ht, HashPosition *pos) +{ + HashPosition *current = pos ? pos : &ht->pInternalPointer; + + IS_CONSISTENT(ht); + + if (*current && (*current)->pListNext) { + return SUCCESS; + } else { + return FAILURE; + } +} + + ZEND_API int zend_hash_move_forward_ex(HashTable *ht, HashPosition *pos) { HashPosition *current = pos ? pos : &ht->pInternalPointer; Index: Zend/zend_hash.h =================================================================== RCS file: /repository/ZendEngine2/zend_hash.h,v retrieving revision 1.67 diff -u -p -r1.67 zend_hash.h --- Zend/zend_hash.h 10 Jun 2003 20:03:25 -0000 1.67 +++ Zend/zend_hash.h 4 Jul 2003 01:52:26 -0000 @@ -164,6 +164,7 @@ ZEND_API int zend_hash_index_exists(Hash ZEND_API ulong zend_hash_next_free_element(HashTable *ht); /* traversing */ +ZEND_API int zend_hash_has_more_elements_ex(HashTable *ht, HashPosition *pos); ZEND_API int zend_hash_move_forward_ex(HashTable *ht, HashPosition *pos); ZEND_API int zend_hash_move_backwards_ex(HashTable *ht, HashPosition *pos); ZEND_API int zend_hash_get_current_key_ex(HashTable *ht, char **str_index, uint *str_length, ulong *num_index, zend_bool duplicate, HashPosition *pos); @@ -172,6 +173,8 @@ ZEND_API int zend_hash_get_current_data_ ZEND_API void zend_hash_internal_pointer_reset_ex(HashTable *ht, HashPosition *pos); ZEND_API void zend_hash_internal_pointer_end_ex(HashTable *ht, HashPosition *pos); +#define zend_hash_has_more_elements(ht) \ + zend_hash_has_more_elements_ex(ht, NULL) #define zend_hash_move_forward(ht) \ zend_hash_move_forward_ex(ht, NULL) #define zend_hash_move_backwards(ht) \