ID: 36391
Updated by: [EMAIL PROTECTED]
Reported By: tomas_matousek at hotmail dot com
Status: Open
Bug Type: Feature/Change Request
Operating System: WinXP
PHP Version: 5.1.2
New Comment:
--- php-5.2.5/ext/standard/array.c 2007-11-06 11:28:21.000000000 -0200
+++ /usr/local/src/php-5.2.5/ext/standard/array.c 2008-01-28
06:35:34.000000000 -0200
@@ -1994,7 +1994,7 @@
**val; /* Value to be popped */
char *key = NULL;
int key_len = 0;
- ulong index;
+ ulong index, new_index = 0;
/* Get the arguments and do error-checking */
if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &stack) ==
FAILURE) {
@@ -2048,6 +2048,10 @@
}
} else if (!key_len && index >=
Z_ARRVAL_PP(stack)->nNextFreeElement-1) {
Z_ARRVAL_PP(stack)->nNextFreeElement =
Z_ARRVAL_PP(stack)->nNextFreeElement - 1;
+ } else if (!key_len && index <
Z_ARRVAL_PP(stack)->nNextFreeElement-1) {
+ zend_hash_internal_pointer_end(Z_ARRVAL_PP(stack));
+ zend_hash_get_current_key_ex(Z_ARRVAL_PP(stack),
&key, &key_len, &new_index, 0, NULL);
+ Z_ARRVAL_PP(stack)->nNextFreeElement = new_index +
1;
}
zend_hash_internal_pointer_reset(Z_ARRVAL_PP(stack));
Previous Comments:
------------------------------------------------------------------------
[2006-02-14 17:33:38] tomas_matousek at hotmail dot com
Description:
------------
Operator $a[] doesn't add a correct key to the array if applied after
popping from array. It seems array_pop merely checks whether the removed
index is the max. int key remembered by the array and if yes it
decreases it by 1. I would expect array_pop to find the new maximal key
in the resulting array.
Reproduce code:
---------------
$a = array("a","b",100 => "c",200 => "d");
array_pop($a);
array_pop($a);
$a[] = "new";
var_dump($a);
Expected result:
----------------
array(3) {
[0]=>
string(1) "a"
[1]=>
string(1) "b"
[2]=>
string(3) "new"
}
Actual result:
--------------
array(3) {
[0]=>
string(1) "a"
[1]=>
string(1) "b"
[199]=>
string(3) "new"
}
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=36391&edit=1