summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrey Hristov <andrey@php.net>1999-07-16 20:08:06 +0000
committerAndrey Hristov <andrey@php.net>1999-07-16 20:08:06 +0000
commit7201cdac963c115efd78909085e0f04cf6dcab7e (patch)
treed19bc8ebf0cd723a48bc3ec7bf7c4ebf1b42a63c
parent538e1cd2305e776f93451f95cf5cbb66f377eac1 (diff)
downloadphp-git-7201cdac963c115efd78909085e0f04cf6dcab7e.tar.gz
Updated the functionality of array_splice.
-rw-r--r--ext/standard/basic_functions.c32
1 files changed, 25 insertions, 7 deletions
diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c
index 71577cff39..8ab1ef1077 100644
--- a/ext/standard/basic_functions.c
+++ b/ext/standard/basic_functions.c
@@ -2670,15 +2670,19 @@ PHP_FUNCTION(array_unshift)
PHP_FUNCTION(array_splice)
{
zval **args, /* Function arguments array */
- *array; /* Input array */
- HashTable *new_hash = NULL; /* Output array's hash */
+ *array, /* Input array */
+ **repl = NULL; /* Replacement elements */
+ HashTable *new_hash = NULL; /* Output array's hash */
+ Bucket *p; /* Bucket used for traversing hash */
int argc, /* Number of function arguments */
+ i,
offset,
- length;
+ length,
+ repl_num = 0; /* Number of replacement elements */
/* Get the argument count and check it */
argc = ARG_COUNT(ht);
- if (argc < 2) {
+ if (argc < 2 || argc > 4) {
WRONG_PARAM_COUNT;
}
@@ -2687,7 +2691,7 @@ PHP_FUNCTION(array_splice)
if (getParametersArray(ht, argc, args) == FAILURE) {
efree(args);
WRONG_PARAM_COUNT;
- }
+ }
/* Get first argument and check that it's an array */
array = args[0];
@@ -2707,13 +2711,25 @@ PHP_FUNCTION(array_splice)
} else
length = -1;
+ if (argc == 4) {
+ /* Make sure the last argument, if passed, is an array */
+ convert_to_array(args[3]);
+
+ /* Create the array of replacement elements */
+ repl_num = zend_hash_num_elements(args[3]->value.ht);
+ repl = (zval **)emalloc(repl_num * sizeof(zval *));
+ for (p=args[3]->value.ht->pListHead, i=0; p; p=p->pListNext, i++) {
+ repl[i] = *((zval **)p->pData);
+ }
+ }
+
/* Initialize return value */
array_init(return_value);
/* Perform splice */
new_hash = _phpi_splice(array->value.ht, offset, length,
- (argc>3) ? &args[3] : NULL , argc-3,
- &return_value->value.ht);
+ repl, repl_num,
+ &return_value->value.ht);
/* Replace input array's hashtable with the new one */
zend_hash_destroy(array->value.ht);
@@ -2721,6 +2737,8 @@ PHP_FUNCTION(array_splice)
array->value.ht = new_hash;
/* Clean up */
+ if (argc == 4)
+ efree(repl);
efree(args);
}
/* }}} */