]> granicus.if.org Git - php/commitdiff
Unset support for spl_array
authorMarcus Boerger <helly@php.net>
Mon, 4 Aug 2003 20:17:53 +0000 (20:17 +0000)
committerMarcus Boerger <helly@php.net>
Mon, 4 Aug 2003 20:17:53 +0000 (20:17 +0000)
ext/spl/spl_array.c
ext/spl/tests/array.phpt

index f7413f5b89356d99e8361a092c51cb8ea8f5a6cf..adf68cb0501fff08b0186779d2a108a054b4001e 100755 (executable)
@@ -370,7 +370,7 @@ static zend_class_entry *spl_array_it_get_ce(zval *object TSRMLS_DC)
 /* }}} */
 
 /* {{{ spl_array_read_dimension */
-zval *spl_array_read_dimension(zval *object, zval *offset TSRMLS_DC)
+static zval *spl_array_read_dimension(zval *object, zval *offset TSRMLS_DC)
 {
        spl_array_object *intern = (spl_array_object*)zend_object_store_get_object(object TSRMLS_CC);
        zval **retval;
@@ -408,7 +408,7 @@ zval *spl_array_read_dimension(zval *object, zval *offset TSRMLS_DC)
 /* }}} */
 
 /* {{{ spl_array_write_dimension */
-void spl_array_write_dimension(zval *object, zval *offset, zval *value TSRMLS_DC)
+static void spl_array_write_dimension(zval *object, zval *offset, zval *value TSRMLS_DC)
 {
        spl_array_object *intern = (spl_array_object*)zend_object_store_get_object(object TSRMLS_CC);
        long index;
@@ -435,8 +435,40 @@ void spl_array_write_dimension(zval *object, zval *offset, zval *value TSRMLS_DC
 }
 /* }}} */
 
-/* {{{*/
-HashTable *spl_array_get_properties(zval *object TSRMLS_DC)
+/* {{{ spl_array_unset_dimension */
+static void spl_array_unset_dimension(zval *object, zval *offset TSRMLS_DC)
+{
+       spl_array_object *intern = (spl_array_object*)zend_object_store_get_object(object TSRMLS_CC);
+       long index;
+
+       switch(Z_TYPE_P(offset)) {
+       case IS_STRING:
+               if (zend_symtable_del(HASH_OF(intern->array), Z_STRVAL_P(offset), Z_STRLEN_P(offset)+1) == FAILURE) {
+                       zend_error(E_NOTICE,"Undefined index:  %s", Z_STRVAL_P(offset));
+               }
+               return;
+       case IS_DOUBLE:
+       case IS_RESOURCE:
+       case IS_BOOL: 
+       case IS_LONG: 
+               if (offset->type == IS_DOUBLE) {
+                       index = (long)Z_DVAL_P(offset);
+               } else {
+                       index = Z_LVAL_P(offset);
+               }
+               if (zend_hash_index_del(HASH_OF(intern->array), index) == FAILURE) {
+                       zend_error(E_NOTICE,"Undefined offset:  %d", Z_LVAL_P(offset));
+               }
+               return;
+       default:
+               zend_error(E_WARNING, "Illegal offset type");
+               return;
+       }
+}
+/* }}} */
+
+/* {{{ spl_array_get_properties */
+static HashTable *spl_array_get_properties(zval *object TSRMLS_DC)
 {
        spl_array_object *intern = (spl_array_object*)zend_object_store_get_object(object TSRMLS_CC);
 
@@ -454,6 +486,7 @@ PHP_MINIT_FUNCTION(spl_array)
        spl_array_handlers.get_class_entry = spl_array_get_ce;
        spl_array_handlers.read_dimension = spl_array_read_dimension;
        spl_array_handlers.write_dimension = spl_array_write_dimension;
+       spl_array_handlers.unset_dimension = spl_array_unset_dimension;
        spl_array_handlers.get_properties = spl_array_get_properties;
 
        REGISTER_SPL_STD_CLASS_EX(array_it, spl_array_object_new, spl_array_it_class_functions);
index 225a9f0bd1b27a0fe4502039a46cefeb2d12fa26..448fc443fe161a381706a6c61730f0b327ad9316 100755 (executable)
@@ -21,6 +21,14 @@ var_dump($ar["a"] = "a");
 var_dump($ar);
 var_dump($ar[0]);
 var_dump($ar[6]);
+var_dump($ar["b"]);
+
+unset($ar[1]);
+unset($ar["3"]);
+unset($ar["a"]);
+unset($ar[7]);
+unset($ar["c"]);
+var_dump($ar);
 
 echo "Done\n";
 ?>
@@ -64,4 +72,17 @@ int(0)
 
 Notice: Undefined offset:  6 in %sarray.php on line %d
 NULL
+
+Notice: Undefined index:  b in %sarray.php on line %d
+NULL
+
+Notice: Undefined offset:  7 in %sarray.php on line %d
+
+Notice: Undefined index:  c in %sarray.php on line %d
+object(spl_array)#1 (2) {
+  [0]=>
+  int(0)
+  [2]=>
+  &int(2)
+}
 Done