-static inline int php_http_querystring_modify_array(zval *qarray, zval *params TSRMLS_DC)
-{
- int rv = 0;
- php_http_array_hashkey_t key = php_http_array_hashkey_init(0);
- HashPosition pos;
- zval **params_entry = NULL;
-
- FOREACH_HASH_KEYVAL(pos, HASH_OF(params), key, params_entry) {
- /* only public properties */
- if ((key.type != HASH_KEY_IS_STRING || *key.str) && php_http_querystring_modify_array_ex(qarray, key.type, key.str, key.len, key.num, *params_entry TSRMLS_CC)) {
- rv = 1;
+ FOREACH_HASH_KEYVAL(pos, ptr, key, params_entry) {
+ /* only public properties */
+ if (key.type != HASH_KEY_IS_STRING || *key.str) {
+ if (Z_TYPE_PP(params_entry) == IS_NULL) {
+ /*
+ * delete
+ */
+ if (key.type == HASH_KEY_IS_STRING) {
+ zend_hash_del(Z_ARRVAL_P(qarray), key.str, key.len);
+ } else {
+ zend_hash_index_del(Z_ARRVAL_P(qarray), key.num);
+ }
+ } else if ( ((key.type == HASH_KEY_IS_STRING) && (SUCCESS == zend_hash_find(Z_ARRVAL_P(qarray), key.str, key.len, (void *) &qarray_entry)))
+ || ((key.type == HASH_KEY_IS_LONG) && (SUCCESS == zend_hash_index_find(Z_ARRVAL_P(qarray), key.num, (void *) &qarray_entry)))) {
+ /*
+ * update
+ */
+ zval equal, *entry = NULL;
+
+ /* recursive */
+ if (Z_TYPE_PP(params_entry) == IS_ARRAY || Z_TYPE_PP(params_entry) == IS_OBJECT) {
+ entry = php_http_zsep(1, IS_ARRAY, *qarray_entry);
+ php_http_querystring_update(entry, *params_entry, NULL TSRMLS_CC);
+ } else if ((FAILURE == is_equal_function(&equal, *qarray_entry, *params_entry TSRMLS_CC)) || !Z_BVAL(equal)) {
+ Z_ADDREF_PP(params_entry);
+ entry = *params_entry;
+ }
+
+ if (entry) {
+ if (key.type == HASH_KEY_IS_STRING) {
+ zend_hash_update(Z_ARRVAL_P(qarray), key.str, key.len, (void *) &entry, sizeof(zval *), NULL);
+ } else {
+ zend_hash_index_update(Z_ARRVAL_P(qarray), key.num, (void *) &entry, sizeof(zval *), NULL);
+ }
+ }
+ } else {
+ /*
+ * add
+ */
+ if (Z_TYPE_PP(params_entry) == IS_OBJECT) {
+ zval *new_array;
+
+ MAKE_STD_ZVAL(new_array);
+ array_init(new_array);
+ php_http_querystring_update(new_array, *params_entry, NULL TSRMLS_CC);
+ *params_entry = new_array;
+ } else {
+ Z_ADDREF_PP(params_entry);
+ }
+ if (key.type == HASH_KEY_IS_STRING) {
+ add_assoc_zval_ex(qarray, key.str, key.len, *params_entry);
+ } else {
+ add_index_zval(qarray, key.num, *params_entry);
+ }
+ }
+ }
+ }
+ /* clean up */
+ if (zv_ptr) {
+ zval_ptr_dtor(&zv_ptr);