Index: ext/standard/array.c =================================================================== RCS file: /repository/php4/ext/standard/array.c,v retrieving revision 1.137 diff -u -r1.137 array.c --- ext/standard/array.c 17 Sep 2001 21:02:51 -0000 1.137 +++ ext/standard/array.c 24 Sep 2001 00:54:36 -0000 @@ -65,6 +65,10 @@ #define SORT_DESC 3 #define SORT_ASC 4 +#define CASE_LOWER 0 +#define CASE_UPPER 1 + + PHP_MINIT_FUNCTION(array) { #ifdef ZTS @@ -83,6 +87,8 @@ REGISTER_LONG_CONSTANT("SORT_REGULAR", SORT_REGULAR, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("SORT_NUMERIC", SORT_NUMERIC, CONST_CS | CONST_PERSISTENT); REGISTER_LONG_CONSTANT("SORT_STRING", SORT_STRING, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("CASE_LOWER", CASE_LOWER, CONST_CS | CONST_PERSISTENT); + REGISTER_LONG_CONSTANT("CASE_UPPER", CASE_UPPER, CONST_CS | CONST_PERSISTENT); return SUCCESS; } @@ -2234,6 +2240,60 @@ } zend_hash_move_forward_ex(target_hash, &pos); + } +} +/* }}} */ + +/* {{{ proto array array_change_key_case(array input [, int case=CASE_LOWER]) + Retuns an array with all string keys lowercased [or uppercased] */ +PHP_FUNCTION(array_change_key_case) +{ + zval **array, **entry, **to_upper; + char *string_key; + char *new_key; + uint str_key_len; + ulong num_key; + ulong change_to_upper=0; + + HashPosition pos; + + if (ZEND_NUM_ARGS() < 1 || ZEND_NUM_ARGS() > 2 || + zend_get_parameters_ex(ZEND_NUM_ARGS(), &array, &to_upper) == FAILURE) { + WRONG_PARAM_COUNT; + } + + if (ZEND_NUM_ARGS() > 1) { + convert_to_long_ex(to_upper); + change_to_upper = Z_LVAL_PP(to_upper); + } + + if (Z_TYPE_PP(array) != IS_ARRAY) { + php_error(E_WARNING, "Wrong datatype in array_change_key_case() call"); + RETURN_FALSE; + } + + array_init(return_value); + + zend_hash_internal_pointer_reset_ex(Z_ARRVAL_PP(array), &pos); + while (zend_hash_get_current_data_ex(Z_ARRVAL_PP(array), (void **)&entry, &pos) == SUCCESS) { + (*entry)->refcount++; + + switch (zend_hash_get_current_key_ex(Z_ARRVAL_PP(array), &string_key, &str_key_len, &num_key, 0, &pos)) { + case HASH_KEY_IS_LONG: + zend_hash_index_update(Z_ARRVAL_P(return_value), num_key, entry, sizeof(entry), NULL); + break; + case HASH_KEY_IS_STRING: + new_key=estrndup(string_key,str_key_len); + if (change_to_upper) + php_strtoupper(new_key, str_key_len - 1); + else + php_strtolower(new_key, str_key_len - 1); + zend_hash_update(Z_ARRVAL_P(return_value), new_key, str_key_len, entry, sizeof(entry), NULL); + efree(new_key); + break; + } + + zend_hash_move_forward_ex(Z_ARRVAL_PP(array), &pos); } } /* }}} */ Index: ext/standard/basic_functions.c =================================================================== RCS file: /repository/php4/ext/standard/basic_functions.c,v retrieving revision 1.401 diff -u -r1.401 basic_functions.c --- ext/standard/basic_functions.c 23 Sep 2001 18:32:46 -0000 1.401 +++ ext/standard/basic_functions.c 24 Sep 2001 00:54:36 -0000 @@ -769,6 +769,7 @@ PHP_FE(array_reduce, NULL) PHP_FE(array_pad, NULL) PHP_FE(array_flip, NULL) + PHP_FE(array_change_key_case, NULL) PHP_FE(array_rand, NULL) PHP_FE(array_unique, NULL) PHP_FE(array_intersect, NULL) Index: ext/standard/php_array.h =================================================================== RCS file: /repository/php4/ext/standard/php_array.h,v retrieving revision 1.28 diff -u -r1.28 php_array.h --- ext/standard/php_array.h 17 Sep 2001 21:02:52 -0000 1.28 +++ ext/standard/php_array.h 24 Sep 2001 00:54:36 -0000 @@ -70,6 +70,7 @@ PHP_FUNCTION(array_reduce); PHP_FUNCTION(array_pad); PHP_FUNCTION(array_flip); +PHP_FUNCTION(array_change_key_case); PHP_FUNCTION(array_rand); PHP_FUNCTION(array_unique); PHP_FUNCTION(array_intersect);