Hi, 

I have written a patch for the above feature request to implement an
array_swap function. 

array_swap($array, $key1, $key2), where keys can be either index or
assoc and array content can be any combination of string, long, array
and object. 

This is my first patch and I am hoping to contribute more to php in the
future so if you don't want to use the patch for any reason, I would be
grateful for any pointers or comments on the code. 

Regards 
Tony Leake 

diff -Nur php-4.2.2/ext/standard/array.c php-4.2.2_devel/ext/standard/array.c
--- php-4.2.2/ext/standard/array.c	2002-04-24 16:29:38.000000000 +0100
+++ php-4.2.2_devel/ext/standard/array.c	2002-08-27 19:09:16.000000000 +0100
@@ -3366,6 +3366,89 @@
 }
 /* }}} */
 
+
+/* {{{ proto bool  array_swap(array input_array, int index1, int index2)
+   swaps 2 elements in an array */
+PHP_FUNCTION( array_swap )
+{
+	zval *input_arr, *temp_arr;
+	zval **tmp1, **tmp2;
+	zval *key1;
+	zval *key2;
+
+	if ( zend_parse_parameters( ZEND_NUM_ARGS() TSRMLS_CC, "azz", &input_arr, &key1, &key2 ) !=SUCCESS ){
+		RETURN_FALSE;
+	}
+	
+
+	MAKE_STD_ZVAL( temp_arr );
+	*temp_arr = *input_arr;
+	SEPARATE_ZVAL( &temp_arr );
+	
+    if ( Z_TYPE_P(key1)==IS_LONG && Z_TYPE_P(key2)==IS_LONG ){
+		
+		if ( zend_hash_index_find( Z_ARRVAL_P( temp_arr ), Z_LVAL_P( key1 ), (void**)&tmp1 )!=SUCCESS){
+			php_error( E_WARNING, "Key 1 does not exist" );
+			return;
+		}
+		
+		if ( zend_hash_index_find( Z_ARRVAL_P( temp_arr ), Z_LVAL_P( key2 ), (void**)&tmp2 )!=SUCCESS){
+			php_error( E_WARNING, "Key 2 does not exist" );
+			return;
+		}
+		
+		add_index_zval( input_arr, Z_LVAL_P( key1 ), *tmp2 );
+		add_index_zval( input_arr, Z_LVAL_P( key2 ), *tmp1 );
+				
+	} else if ( Z_TYPE_P( key1 )==IS_LONG && Z_TYPE_P( key2 )==IS_STRING ){
+		
+		if ( zend_hash_index_find( Z_ARRVAL_P( temp_arr ), Z_LVAL_P( key1 ), (void**)&tmp1 )!=SUCCESS){
+			php_error( E_WARNING, "Key 1 does not exist" );
+			return;
+		}
+		
+		if ( zend_hash_find( Z_ARRVAL_P( temp_arr ), Z_STRVAL_P( key2 ), Z_STRLEN_P( key2 )+1, (void**)&tmp2 )!=SUCCESS){
+			php_error( E_WARNING, "Key 2 does not exist" );
+			return;
+		}
+		
+		add_index_zval( input_arr, Z_LVAL_P( key1 ), *tmp2 );
+		add_assoc_zval( input_arr, Z_STRVAL_P( key2 ), *tmp1);
+				
+	} else if ( Z_TYPE_P( key1 )==IS_STRING && Z_TYPE_P( key2 )==IS_LONG){
+		
+		if ( zend_hash_find( Z_ARRVAL_P( temp_arr ), Z_STRVAL_P(key1), Z_STRLEN_P( key1 )+1, (void**)&tmp1 )!=SUCCESS){
+			php_error( E_WARNING, "Key 1 does not exist" );
+			return;
+		}
+		
+		if ( zend_hash_index_find( Z_ARRVAL_P( temp_arr ), Z_LVAL_P( key2 ), (void**)&tmp2 )!=SUCCESS){
+			php_error( E_WARNING, "Key 2 does not exist" );
+			return;
+		}
+		
+		add_assoc_zval( input_arr, Z_STRVAL_P( key1 ), *tmp2);
+		add_index_zval( input_arr, Z_LVAL_P( key2 ), *tmp1 );
+		
+	}else{
+		
+		if ( zend_hash_find( Z_ARRVAL_P( temp_arr ), Z_STRVAL_P( key1 ), Z_STRLEN_P( key1 )+1, (void**)&tmp1 )!=SUCCESS){
+			php_error( E_WARNING, "Key 1 does not exist" );
+			return;
+		}
+		
+		if ( zend_hash_find( Z_ARRVAL_P( temp_arr ), Z_STRVAL_P(key2), Z_STRLEN_P( key2 )+1, (void**)&tmp2 )!=SUCCESS){
+			php_error( E_WARNING, "Key 2 does not exist" );
+			return;
+		}
+		
+		add_assoc_zval( input_arr, Z_STRVAL_P( key1 ), *tmp2);
+		add_assoc_zval( input_arr, Z_STRVAL_P( key2 ), *tmp1);
+	}
+	
+	RETURN_TRUE;
+}
+/* }}} */
 /*
  * Local variables:
  * tab-width: 4
diff -Nur php-4.2.2/ext/standard/basic_functions.c php-4.2.2_devel/ext/standard/basic_functions.c
--- php-4.2.2/ext/standard/basic_functions.c	2002-05-11 20:23:05.000000000 +0100
+++ php-4.2.2_devel/ext/standard/basic_functions.c	2002-08-27 19:11:34.000000000 +0100
@@ -793,6 +793,7 @@
 	PHP_FE(array_map,														NULL)
 	PHP_FE(array_chunk,														NULL)
 	PHP_FE(array_key_exists,														NULL)
+	PHP_FE(array_swap,				first_arg_force_ref)
 
 	/* aliases from array.c */
 	PHP_FALIAS(pos, 				current, 				 first_arg_force_ref)
diff -Nur php-4.2.2/ext/standard/php_array.h php-4.2.2_devel/ext/standard/php_array.h
--- php-4.2.2/ext/standard/php_array.h	2001-12-11 15:30:34.000000000 +0000
+++ php-4.2.2_devel/ext/standard/php_array.h	2002-08-27 19:09:39.000000000 +0100
@@ -81,6 +81,7 @@
 PHP_FUNCTION(array_map);
 PHP_FUNCTION(array_key_exists);
 PHP_FUNCTION(array_chunk);
+PHP_FUNCTION(array_swap);
 
 HashTable* php_splice(HashTable *, int, int, zval ***, int, HashTable **);
 PHPAPI void php_array_merge(HashTable *dest, HashTable *src, int recursive);

-- 
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to