diff --git a/NEWS b/NEWS index 98c8d3b3106b..5c6f6e8db9e3 100644 --- a/NEWS +++ b/NEWS @@ -91,6 +91,8 @@ PHP NEWS INT_MAX instead of truncating it. (marc-mabe) . Fixed GH-23338 (fsockopen()/pfsockopen() ValueError reported wrong argument number for $timeout). (lacatoire) + . Fixed bug GH-23576 (Next index for array returned from array_keys() is + wrong). (Lazizbek Ergashev) - SimpleXML: . Fixed writing to a dimension of the object returned by attributes() not diff --git a/ext/standard/array.c b/ext/standard/array.c index acf65c07bd67..213402c7819a 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -4406,7 +4406,7 @@ PHP_FUNCTION(array_keys) /* Base case: empty input */ if (!elem_count) { - RETURN_COPY(input); + RETURN_EMPTY_ARRAY(); } /* Initialize return array */ diff --git a/ext/standard/tests/array/gh23576.phpt b/ext/standard/tests/array/gh23576.phpt new file mode 100644 index 000000000000..c3ada5559a23 --- /dev/null +++ b/ext/standard/tests/array/gh23576.phpt @@ -0,0 +1,58 @@ +--TEST-- +GH-23576 (Next index for array returned from array_keys() is wrong) +--FILE-- + 123]; +unset($a[123]); + +$b = array_keys($a); +$b[] = 42; +var_dump($b); + +$c = array_keys($a, 123); +$c[] = 42; +var_dump($c); + +$d = array_keys($a, 123, true); +$d[] = 42; +var_dump($d); + +$e = []; + +$f = array_keys($e); +$f[] = 42; +var_dump($f); + +$g = array_keys($e, 123); +$g[] = 42; +var_dump($g); + +$h = array_keys($e, 123, true); +$h[] = 42; +var_dump($h); +?> +--EXPECT-- +array(1) { + [0]=> + int(42) +} +array(1) { + [0]=> + int(42) +} +array(1) { + [0]=> + int(42) +} +array(1) { + [0]=> + int(42) +} +array(1) { + [0]=> + int(42) +} +array(1) { + [0]=> + int(42) +}