Skip to content

Commit 641aef3

Browse files
committed
Allow array_intersect() with single array argument
1 parent 53e1087 commit 641aef3

22 files changed

+675
-809
lines changed

ext/standard/array.c

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -4613,7 +4613,6 @@ static void php_array_intersect_key(INTERNAL_FUNCTION_PARAMETERS, int data_compa
46134613
int (*intersect_data_compare_func)(zval *, zval *) = NULL;
46144614
zend_bool ok;
46154615
zval *val, *data;
4616-
int req_args;
46174616
char *param_spec;
46184617
zend_string *key;
46194618
zend_ulong h;
@@ -4622,25 +4621,18 @@ static void php_array_intersect_key(INTERNAL_FUNCTION_PARAMETERS, int data_compa
46224621
argc = ZEND_NUM_ARGS();
46234622
if (data_compare_type == INTERSECT_COMP_DATA_USER) {
46244623
/* INTERSECT_COMP_DATA_USER - array_uintersect_assoc() */
4625-
req_args = 3;
46264624
param_spec = "+f";
46274625
intersect_data_compare_func = zval_user_compare;
46284626
} else {
46294627
/* INTERSECT_COMP_DATA_NONE - array_intersect_key()
46304628
INTERSECT_COMP_DATA_INTERNAL - array_intersect_assoc() */
4631-
req_args = 2;
46324629
param_spec = "+";
46334630

46344631
if (data_compare_type == INTERSECT_COMP_DATA_INTERNAL) {
46354632
intersect_data_compare_func = zval_compare;
46364633
}
46374634
}
46384635

4639-
if (argc < req_args) {
4640-
zend_argument_count_error("At least %d parameters are required, %d given", req_args, argc);
4641-
RETURN_THROWS();
4642-
}
4643-
46444636
if (zend_parse_parameters(ZEND_NUM_ARGS(), param_spec, &args, &argc, &BG(user_compare_fci), &BG(user_compare_fci_cache)) == FAILURE) {
46454637
RETURN_THROWS();
46464638
}
@@ -4701,7 +4693,6 @@ static void php_array_intersect(INTERNAL_FUNCTION_PARAMETERS, int behavior, int
47014693
int arr_argc, i, c = 0;
47024694
uint32_t idx;
47034695
Bucket **lists, *list, **ptrs, *p;
4704-
uint32_t req_args;
47054696
char *param_spec;
47064697
zend_fcall_info fci1, fci2;
47074698
zend_fcall_info_cache fci1_cache = empty_fcall_info_cache, fci2_cache = empty_fcall_info_cache;
@@ -4717,24 +4708,17 @@ static void php_array_intersect(INTERNAL_FUNCTION_PARAMETERS, int behavior, int
47174708

47184709
if (data_compare_type == INTERSECT_COMP_DATA_INTERNAL) {
47194710
/* array_intersect() */
4720-
req_args = 2;
47214711
param_spec = "+";
47224712
intersect_data_compare_func = php_array_data_compare_string_unstable;
47234713
} else if (data_compare_type == INTERSECT_COMP_DATA_USER) {
47244714
/* array_uintersect() */
4725-
req_args = 3;
47264715
param_spec = "+f";
47274716
intersect_data_compare_func = php_array_user_compare_unstable;
47284717
} else {
47294718
ZEND_ASSERT(0 && "Invalid data_compare_type");
47304719
return;
47314720
}
47324721

4733-
if (ZEND_NUM_ARGS() < req_args) {
4734-
zend_argument_count_error("At least %d parameters are required, %d given", req_args, ZEND_NUM_ARGS());
4735-
RETURN_THROWS();
4736-
}
4737-
47384722
if (zend_parse_parameters(ZEND_NUM_ARGS(), param_spec, &args, &arr_argc, &fci1, &fci1_cache) == FAILURE) {
47394723
RETURN_THROWS();
47404724
}
@@ -4747,29 +4731,25 @@ static void php_array_intersect(INTERNAL_FUNCTION_PARAMETERS, int behavior, int
47474731

47484732
if (data_compare_type == INTERSECT_COMP_DATA_INTERNAL && key_compare_type == INTERSECT_COMP_KEY_INTERNAL) {
47494733
/* array_intersect_assoc() or array_intersect_key() */
4750-
req_args = 2;
47514734
param_spec = "+";
47524735
intersect_key_compare_func = php_array_key_compare_string_unstable;
47534736
intersect_data_compare_func = php_array_data_compare_string_unstable;
47544737
} else if (data_compare_type == INTERSECT_COMP_DATA_USER && key_compare_type == INTERSECT_COMP_KEY_INTERNAL) {
47554738
/* array_uintersect_assoc() */
4756-
req_args = 3;
47574739
param_spec = "+f";
47584740
intersect_key_compare_func = php_array_key_compare_string_unstable;
47594741
intersect_data_compare_func = php_array_user_compare_unstable;
47604742
fci_data = &fci1;
47614743
fci_data_cache = &fci1_cache;
47624744
} else if (data_compare_type == INTERSECT_COMP_DATA_INTERNAL && key_compare_type == INTERSECT_COMP_KEY_USER) {
47634745
/* array_intersect_uassoc() or array_intersect_ukey() */
4764-
req_args = 3;
47654746
param_spec = "+f";
47664747
intersect_key_compare_func = php_array_user_key_compare_unstable;
47674748
intersect_data_compare_func = php_array_data_compare_string_unstable;
47684749
fci_key = &fci1;
47694750
fci_key_cache = &fci1_cache;
47704751
} else if (data_compare_type == INTERSECT_COMP_DATA_USER && key_compare_type == INTERSECT_COMP_KEY_USER) {
47714752
/* array_uintersect_uassoc() */
4772-
req_args = 4;
47734753
param_spec = "+ff";
47744754
intersect_key_compare_func = php_array_user_key_compare_unstable;
47754755
intersect_data_compare_func = php_array_user_compare_unstable;
@@ -4782,11 +4762,6 @@ static void php_array_intersect(INTERNAL_FUNCTION_PARAMETERS, int behavior, int
47824762
return;
47834763
}
47844764

4785-
if (ZEND_NUM_ARGS() < req_args) {
4786-
zend_argument_count_error("At least %d parameters are required, %d given", req_args, ZEND_NUM_ARGS());
4787-
RETURN_THROWS();
4788-
}
4789-
47904765
if (zend_parse_parameters(ZEND_NUM_ARGS(), param_spec, &args, &arr_argc, &fci1, &fci1_cache, &fci2, &fci2_cache) == FAILURE) {
47914766
RETURN_THROWS();
47924767
}

ext/standard/basic_functions.stub.php

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -178,26 +178,26 @@ function array_change_key_case(array $array, int $case = CASE_LOWER): array {}
178178

179179
function array_unique(array $array, int $flags = SORT_STRING): array {}
180180

181-
function array_intersect_key(array $array1, array $array2, array ...$arrays): array {}
181+
function array_intersect_key(array $array, array ...$arrays): array {}
182182

183183
/** @param array|callable $rest */
184-
function array_intersect_ukey(array $array1, array $array2, ...$rest): array {}
184+
function array_intersect_ukey(array $array, ...$rest): array {}
185185

186-
function array_intersect(array $array1, array $array2, array ...$arrays): array {}
186+
function array_intersect(array $array, array ...$arrays): array {}
187187

188188
/** @param array|callable $rest */
189-
function array_uintersect(array $array1, array $array2, ...$rest): array {}
189+
function array_uintersect(array $array, ...$rest): array {}
190190

191-
function array_intersect_assoc(array $array1, array $array2, array ...$arrays): array {}
191+
function array_intersect_assoc(array $array, array ...$arrays): array {}
192192

193193
/** @param array|callable $rest */
194-
function array_uintersect_assoc(array $array1, array $array2, ...$rest): array {}
194+
function array_uintersect_assoc(array $array, ...$rest): array {}
195195

196196
/** @param array|callable $rest */
197-
function array_intersect_uassoc(array $array1, array $array2, ...$rest): array {}
197+
function array_intersect_uassoc(array $array, ...$rest): array {}
198198

199199
/** @param array|callable $rest */
200-
function array_uintersect_uassoc(array $array1, array $array2, ...$rest): array {}
200+
function array_uintersect_uassoc(array $array, ...$rest): array {}
201201

202202
function array_diff_key(array $array, array ...$arrays): array {}
203203

ext/standard/basic_functions_arginfo.h

Lines changed: 13 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/* This is a generated file, edit the .stub.php file instead.
2-
* Stub hash: 07205773da4b7c010ed6c9119e3d0b2650bee544 */
2+
* Stub hash: ff744f9fd6c09973ada85db0b370fc115a409c07 */
33

44
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_set_time_limit, 0, 1, _IS_BOOL, 0)
55
ZEND_ARG_TYPE_INFO(0, seconds, IS_LONG, 0)
@@ -273,15 +273,13 @@ ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_array_unique, 0, 1, IS_ARRAY, 0)
273273
ZEND_ARG_TYPE_INFO_WITH_DEFAULT_VALUE(0, flags, IS_LONG, 0, "SORT_STRING")
274274
ZEND_END_ARG_INFO()
275275

276-
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_array_intersect_key, 0, 2, IS_ARRAY, 0)
277-
ZEND_ARG_TYPE_INFO(0, array1, IS_ARRAY, 0)
278-
ZEND_ARG_TYPE_INFO(0, array2, IS_ARRAY, 0)
276+
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_array_intersect_key, 0, 1, IS_ARRAY, 0)
277+
ZEND_ARG_TYPE_INFO(0, array, IS_ARRAY, 0)
279278
ZEND_ARG_VARIADIC_TYPE_INFO(0, arrays, IS_ARRAY, 0)
280279
ZEND_END_ARG_INFO()
281280

282-
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_array_intersect_ukey, 0, 2, IS_ARRAY, 0)
283-
ZEND_ARG_TYPE_INFO(0, array1, IS_ARRAY, 0)
284-
ZEND_ARG_TYPE_INFO(0, array2, IS_ARRAY, 0)
281+
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_array_intersect_ukey, 0, 1, IS_ARRAY, 0)
282+
ZEND_ARG_TYPE_INFO(0, array, IS_ARRAY, 0)
285283
ZEND_ARG_VARIADIC_INFO(0, rest)
286284
ZEND_END_ARG_INFO()
287285

@@ -297,27 +295,21 @@ ZEND_END_ARG_INFO()
297295

298296
#define arginfo_array_uintersect_uassoc arginfo_array_intersect_ukey
299297

300-
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_array_diff_key, 0, 1, IS_ARRAY, 0)
301-
ZEND_ARG_TYPE_INFO(0, array, IS_ARRAY, 0)
302-
ZEND_ARG_VARIADIC_TYPE_INFO(0, arrays, IS_ARRAY, 0)
303-
ZEND_END_ARG_INFO()
298+
#define arginfo_array_diff_key arginfo_array_intersect_key
304299

305-
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_array_diff_ukey, 0, 1, IS_ARRAY, 0)
306-
ZEND_ARG_TYPE_INFO(0, array, IS_ARRAY, 0)
307-
ZEND_ARG_VARIADIC_INFO(0, rest)
308-
ZEND_END_ARG_INFO()
300+
#define arginfo_array_diff_ukey arginfo_array_intersect_ukey
309301

310-
#define arginfo_array_diff arginfo_array_diff_key
302+
#define arginfo_array_diff arginfo_array_intersect_key
311303

312-
#define arginfo_array_udiff arginfo_array_diff_ukey
304+
#define arginfo_array_udiff arginfo_array_intersect_ukey
313305

314-
#define arginfo_array_diff_assoc arginfo_array_diff_key
306+
#define arginfo_array_diff_assoc arginfo_array_intersect_key
315307

316-
#define arginfo_array_diff_uassoc arginfo_array_diff_ukey
308+
#define arginfo_array_diff_uassoc arginfo_array_intersect_ukey
317309

318-
#define arginfo_array_udiff_assoc arginfo_array_diff_ukey
310+
#define arginfo_array_udiff_assoc arginfo_array_intersect_ukey
319311

320-
#define arginfo_array_udiff_uassoc arginfo_array_diff_ukey
312+
#define arginfo_array_udiff_uassoc arginfo_array_intersect_ukey
321313

322314
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_array_multisort, 0, 1, _IS_BOOL, 0)
323315
ZEND_ARG_INFO(ZEND_SEND_PREFER_REF, array1)

ext/standard/tests/array/array_intersect_assoc_error.phpt

Lines changed: 0 additions & 34 deletions
This file was deleted.

ext/standard/tests/array/array_intersect_assoc_variation1.phpt

Lines changed: 48 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -113,75 +113,75 @@ echo "Done";
113113
--EXPECT--
114114
*** Testing array_intersect_assoc() : Passing non-array values to $array1 argument ***
115115

116-
-- Iteration 1 --array_intersect_assoc(): Argument #1 ($array1) must be of type array, int given
117-
array_intersect_assoc(): Argument #1 ($array1) must be of type array, int given
116+
-- Iteration 1 --array_intersect_assoc(): Argument #1 ($array) must be of type array, int given
117+
array_intersect_assoc(): Argument #1 ($array) must be of type array, int given
118118

119-
-- Iteration 2 --array_intersect_assoc(): Argument #1 ($array1) must be of type array, int given
120-
array_intersect_assoc(): Argument #1 ($array1) must be of type array, int given
119+
-- Iteration 2 --array_intersect_assoc(): Argument #1 ($array) must be of type array, int given
120+
array_intersect_assoc(): Argument #1 ($array) must be of type array, int given
121121

122-
-- Iteration 3 --array_intersect_assoc(): Argument #1 ($array1) must be of type array, int given
123-
array_intersect_assoc(): Argument #1 ($array1) must be of type array, int given
122+
-- Iteration 3 --array_intersect_assoc(): Argument #1 ($array) must be of type array, int given
123+
array_intersect_assoc(): Argument #1 ($array) must be of type array, int given
124124

125-
-- Iteration 4 --array_intersect_assoc(): Argument #1 ($array1) must be of type array, int given
126-
array_intersect_assoc(): Argument #1 ($array1) must be of type array, int given
125+
-- Iteration 4 --array_intersect_assoc(): Argument #1 ($array) must be of type array, int given
126+
array_intersect_assoc(): Argument #1 ($array) must be of type array, int given
127127

128-
-- Iteration 5 --array_intersect_assoc(): Argument #1 ($array1) must be of type array, float given
129-
array_intersect_assoc(): Argument #1 ($array1) must be of type array, float given
128+
-- Iteration 5 --array_intersect_assoc(): Argument #1 ($array) must be of type array, float given
129+
array_intersect_assoc(): Argument #1 ($array) must be of type array, float given
130130

131-
-- Iteration 6 --array_intersect_assoc(): Argument #1 ($array1) must be of type array, float given
132-
array_intersect_assoc(): Argument #1 ($array1) must be of type array, float given
131+
-- Iteration 6 --array_intersect_assoc(): Argument #1 ($array) must be of type array, float given
132+
array_intersect_assoc(): Argument #1 ($array) must be of type array, float given
133133

134-
-- Iteration 7 --array_intersect_assoc(): Argument #1 ($array1) must be of type array, float given
135-
array_intersect_assoc(): Argument #1 ($array1) must be of type array, float given
134+
-- Iteration 7 --array_intersect_assoc(): Argument #1 ($array) must be of type array, float given
135+
array_intersect_assoc(): Argument #1 ($array) must be of type array, float given
136136

137-
-- Iteration 8 --array_intersect_assoc(): Argument #1 ($array1) must be of type array, float given
138-
array_intersect_assoc(): Argument #1 ($array1) must be of type array, float given
137+
-- Iteration 8 --array_intersect_assoc(): Argument #1 ($array) must be of type array, float given
138+
array_intersect_assoc(): Argument #1 ($array) must be of type array, float given
139139

140-
-- Iteration 9 --array_intersect_assoc(): Argument #1 ($array1) must be of type array, float given
141-
array_intersect_assoc(): Argument #1 ($array1) must be of type array, float given
140+
-- Iteration 9 --array_intersect_assoc(): Argument #1 ($array) must be of type array, float given
141+
array_intersect_assoc(): Argument #1 ($array) must be of type array, float given
142142

143-
-- Iteration 10 --array_intersect_assoc(): Argument #1 ($array1) must be of type array, null given
144-
array_intersect_assoc(): Argument #1 ($array1) must be of type array, null given
143+
-- Iteration 10 --array_intersect_assoc(): Argument #1 ($array) must be of type array, null given
144+
array_intersect_assoc(): Argument #1 ($array) must be of type array, null given
145145

146-
-- Iteration 11 --array_intersect_assoc(): Argument #1 ($array1) must be of type array, null given
147-
array_intersect_assoc(): Argument #1 ($array1) must be of type array, null given
146+
-- Iteration 11 --array_intersect_assoc(): Argument #1 ($array) must be of type array, null given
147+
array_intersect_assoc(): Argument #1 ($array) must be of type array, null given
148148

149-
-- Iteration 12 --array_intersect_assoc(): Argument #1 ($array1) must be of type array, bool given
150-
array_intersect_assoc(): Argument #1 ($array1) must be of type array, bool given
149+
-- Iteration 12 --array_intersect_assoc(): Argument #1 ($array) must be of type array, bool given
150+
array_intersect_assoc(): Argument #1 ($array) must be of type array, bool given
151151

152-
-- Iteration 13 --array_intersect_assoc(): Argument #1 ($array1) must be of type array, bool given
153-
array_intersect_assoc(): Argument #1 ($array1) must be of type array, bool given
152+
-- Iteration 13 --array_intersect_assoc(): Argument #1 ($array) must be of type array, bool given
153+
array_intersect_assoc(): Argument #1 ($array) must be of type array, bool given
154154

155-
-- Iteration 14 --array_intersect_assoc(): Argument #1 ($array1) must be of type array, bool given
156-
array_intersect_assoc(): Argument #1 ($array1) must be of type array, bool given
155+
-- Iteration 14 --array_intersect_assoc(): Argument #1 ($array) must be of type array, bool given
156+
array_intersect_assoc(): Argument #1 ($array) must be of type array, bool given
157157

158-
-- Iteration 15 --array_intersect_assoc(): Argument #1 ($array1) must be of type array, bool given
159-
array_intersect_assoc(): Argument #1 ($array1) must be of type array, bool given
158+
-- Iteration 15 --array_intersect_assoc(): Argument #1 ($array) must be of type array, bool given
159+
array_intersect_assoc(): Argument #1 ($array) must be of type array, bool given
160160

161-
-- Iteration 16 --array_intersect_assoc(): Argument #1 ($array1) must be of type array, string given
162-
array_intersect_assoc(): Argument #1 ($array1) must be of type array, string given
161+
-- Iteration 16 --array_intersect_assoc(): Argument #1 ($array) must be of type array, string given
162+
array_intersect_assoc(): Argument #1 ($array) must be of type array, string given
163163

164-
-- Iteration 17 --array_intersect_assoc(): Argument #1 ($array1) must be of type array, string given
165-
array_intersect_assoc(): Argument #1 ($array1) must be of type array, string given
164+
-- Iteration 17 --array_intersect_assoc(): Argument #1 ($array) must be of type array, string given
165+
array_intersect_assoc(): Argument #1 ($array) must be of type array, string given
166166

167-
-- Iteration 18 --array_intersect_assoc(): Argument #1 ($array1) must be of type array, string given
168-
array_intersect_assoc(): Argument #1 ($array1) must be of type array, string given
167+
-- Iteration 18 --array_intersect_assoc(): Argument #1 ($array) must be of type array, string given
168+
array_intersect_assoc(): Argument #1 ($array) must be of type array, string given
169169

170-
-- Iteration 19 --array_intersect_assoc(): Argument #1 ($array1) must be of type array, string given
171-
array_intersect_assoc(): Argument #1 ($array1) must be of type array, string given
170+
-- Iteration 19 --array_intersect_assoc(): Argument #1 ($array) must be of type array, string given
171+
array_intersect_assoc(): Argument #1 ($array) must be of type array, string given
172172

173-
-- Iteration 20 --array_intersect_assoc(): Argument #1 ($array1) must be of type array, string given
174-
array_intersect_assoc(): Argument #1 ($array1) must be of type array, string given
173+
-- Iteration 20 --array_intersect_assoc(): Argument #1 ($array) must be of type array, string given
174+
array_intersect_assoc(): Argument #1 ($array) must be of type array, string given
175175

176-
-- Iteration 21 --array_intersect_assoc(): Argument #1 ($array1) must be of type array, classA given
177-
array_intersect_assoc(): Argument #1 ($array1) must be of type array, classA given
176+
-- Iteration 21 --array_intersect_assoc(): Argument #1 ($array) must be of type array, classA given
177+
array_intersect_assoc(): Argument #1 ($array) must be of type array, classA given
178178

179-
-- Iteration 22 --array_intersect_assoc(): Argument #1 ($array1) must be of type array, null given
180-
array_intersect_assoc(): Argument #1 ($array1) must be of type array, null given
179+
-- Iteration 22 --array_intersect_assoc(): Argument #1 ($array) must be of type array, null given
180+
array_intersect_assoc(): Argument #1 ($array) must be of type array, null given
181181

182-
-- Iteration 23 --array_intersect_assoc(): Argument #1 ($array1) must be of type array, null given
183-
array_intersect_assoc(): Argument #1 ($array1) must be of type array, null given
182+
-- Iteration 23 --array_intersect_assoc(): Argument #1 ($array) must be of type array, null given
183+
array_intersect_assoc(): Argument #1 ($array) must be of type array, null given
184184

185-
-- Iteration 24 --array_intersect_assoc(): Argument #1 ($array1) must be of type array, resource given
186-
array_intersect_assoc(): Argument #1 ($array1) must be of type array, resource given
185+
-- Iteration 24 --array_intersect_assoc(): Argument #1 ($array) must be of type array, resource given
186+
array_intersect_assoc(): Argument #1 ($array) must be of type array, resource given
187187
Done

0 commit comments

Comments
 (0)