]> granicus.if.org Git - php/commitdiff
- Add optional use_keys parameter to iterator_to_array(), (idea by Kevin)
authorMarcus Boerger <helly@php.net>
Mon, 20 Nov 2006 19:50:19 +0000 (19:50 +0000)
committerMarcus Boerger <helly@php.net>
Mon, 20 Nov 2006 19:50:19 +0000 (19:50 +0000)
ext/spl/php_spl.c
ext/spl/spl.php
ext/spl/spl_iterators.c

index f3b36fd2778e1ca790b54beb685e8597ff298a15..cbcd9bd985037418f4738c25ccaa6425fe0a633b 100755 (executable)
@@ -657,6 +657,12 @@ PHP_MINFO_FUNCTION(spl)
 }
 /* }}} */
 
+static
+ZEND_BEGIN_ARG_INFO(arginfo_iterator_to_array, 0)
+       ZEND_ARG_OBJ_INFO(0, iterator, Traversable, 0)
+       ZEND_ARG_INFO(0, use_keys)
+ZEND_END_ARG_INFO();
+
 static
 ZEND_BEGIN_ARG_INFO(arginfo_iterator, 0)
        ZEND_ARG_OBJ_INFO(0, iterator, Traversable, 0)
@@ -683,7 +689,7 @@ zend_function_entry spl_functions[] = {
        PHP_FE(class_implements,        NULL)
        PHP_FE(spl_object_hash,         NULL)
 #ifdef SPL_ITERATORS_H
-       PHP_FE(iterator_to_array,       arginfo_iterator)
+       PHP_FE(iterator_to_array,       arginfo_iterator_to_array)
        PHP_FE(iterator_count,          arginfo_iterator)
        PHP_FE(iterator_apply,          arginfo_iterator_apply)
 #endif /* SPL_ITERATORS_H */
index 2987024f26c07f711f6a498566db399bed3d161b..9a850075e0c9fa5312ee432f2d986d4cea4a7875 100755 (executable)
@@ -229,9 +229,10 @@ function iterator_count(Traversable $it) {/**/};
  * @since PHP 5.1
  *
  * @param it  iterator to copy
+ * @param use_keys whether touse the keys
  * @return array with elements copied from the iterator
  */
-function iterator_to_array(Traversable $it) {/**/};
+function iterator_to_array(Traversable $it, $use_keys = true) {/**/};
 
 /** @ingroup ZendEngine
  * @brief Basic Exception class.
index 01d4d4233e926f3c7880f683037eb1549a8c5a36..da4811ee75d833a069e493ffa5a8cefa5f8974a0 100755 (executable)
@@ -2785,23 +2785,38 @@ static int spl_iterator_to_array_apply(zend_object_iterator *iter, void *puser T
 }
 /* }}} */
 
-/* {{{ proto array iterator_to_array(Traversable it) 
+static int spl_iterator_to_values_apply(zend_object_iterator *iter, void *puser TSRMLS_DC) /* {{{ */
+{
+       zval **data, *return_value = (zval*)puser;
+
+       iter->funcs->get_current_data(iter, &data TSRMLS_CC);
+       if (EG(exception)) {
+               return ZEND_HASH_APPLY_STOP;
+       }
+       (*data)->refcount++;
+       add_next_index_zval(return_value, *data);
+       return ZEND_HASH_APPLY_KEEP;
+}
+/* }}} */
+
+/* {{{ proto array iterator_to_array(Traversable it [, bool use_keys = true]) 
    Copy the iterator into an array */
 PHP_FUNCTION(iterator_to_array)
 {
        zval  *obj;
+       zend_bool use_keys = 1;
 
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O", &obj, zend_ce_traversable) == FAILURE) {
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "O|b", &obj, zend_ce_traversable, &use_keys) == FAILURE) {
                RETURN_FALSE;
        }
 
        array_init(return_value);
-       
-       if (spl_iterator_apply(obj, spl_iterator_to_array_apply, (void*)return_value TSRMLS_CC) != SUCCESS) {
+
+       if (spl_iterator_apply(obj, use_keys ? spl_iterator_to_array_apply : spl_iterator_to_values_apply, (void*)return_value TSRMLS_CC) != SUCCESS) {
                zval_dtor(return_value);
                RETURN_NULL();
        }
-}
+} /* }}} */
 
 static int spl_iterator_count_apply(zend_object_iterator *iter, void *puser TSRMLS_DC) /* {{{ */
 {