Skip to content

Commit fb5d69d

Browse files
committed
Allow array_diff() with single array argument
1 parent 2386f65 commit fb5d69d

24 files changed

+539
-672
lines changed

ext/standard/array.c

Lines changed: 0 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -5023,19 +5023,11 @@ static void php_array_diff_key(INTERNAL_FUNCTION_PARAMETERS, int data_compare_ty
50235023
/* Get the argument count */
50245024
argc = ZEND_NUM_ARGS();
50255025
if (data_compare_type == DIFF_COMP_DATA_USER) {
5026-
if (argc < 3) {
5027-
zend_argument_count_error("At least 3 parameters are required, %d given", ZEND_NUM_ARGS());
5028-
RETURN_THROWS();
5029-
}
50305026
if (zend_parse_parameters(ZEND_NUM_ARGS(), "+f", &args, &argc, &BG(user_compare_fci), &BG(user_compare_fci_cache)) == FAILURE) {
50315027
RETURN_THROWS();
50325028
}
50335029
diff_data_compare_func = zval_user_compare;
50345030
} else {
5035-
if (argc < 2) {
5036-
zend_argument_count_error("At least 2 parameters are required, %d given", ZEND_NUM_ARGS());
5037-
RETURN_THROWS();
5038-
}
50395031
if (zend_parse_parameters(ZEND_NUM_ARGS(), "+", &args, &argc) == FAILURE) {
50405032
RETURN_THROWS();
50415033
}
@@ -5100,7 +5092,6 @@ static void php_array_diff(INTERNAL_FUNCTION_PARAMETERS, int behavior, int data_
51005092
int arr_argc, i, c;
51015093
uint32_t idx;
51025094
Bucket **lists, *list, **ptrs, *p;
5103-
uint32_t req_args;
51045095
char *param_spec;
51055096
zend_fcall_info fci1, fci2;
51065097
zend_fcall_info_cache fci1_cache = empty_fcall_info_cache, fci2_cache = empty_fcall_info_cache;
@@ -5116,24 +5107,17 @@ static void php_array_diff(INTERNAL_FUNCTION_PARAMETERS, int behavior, int data_
51165107

51175108
if (data_compare_type == DIFF_COMP_DATA_INTERNAL) {
51185109
/* array_diff */
5119-
req_args = 2;
51205110
param_spec = "+";
51215111
diff_data_compare_func = php_array_data_compare_string_unstable;
51225112
} else if (data_compare_type == DIFF_COMP_DATA_USER) {
51235113
/* array_udiff */
5124-
req_args = 3;
51255114
param_spec = "+f";
51265115
diff_data_compare_func = php_array_user_compare_unstable;
51275116
} else {
51285117
ZEND_ASSERT(0 && "Invalid data_compare_type");
51295118
return;
51305119
}
51315120

5132-
if (ZEND_NUM_ARGS() < req_args) {
5133-
zend_argument_count_error("At least %d parameters are required, %d given", req_args, ZEND_NUM_ARGS());
5134-
RETURN_THROWS();
5135-
}
5136-
51375121
if (zend_parse_parameters(ZEND_NUM_ARGS(), param_spec, &args, &arr_argc, &fci1, &fci1_cache) == FAILURE) {
51385122
RETURN_THROWS();
51395123
}
@@ -5146,29 +5130,25 @@ static void php_array_diff(INTERNAL_FUNCTION_PARAMETERS, int behavior, int data_
51465130

51475131
if (data_compare_type == DIFF_COMP_DATA_INTERNAL && key_compare_type == DIFF_COMP_KEY_INTERNAL) {
51485132
/* array_diff_assoc() or array_diff_key() */
5149-
req_args = 2;
51505133
param_spec = "+";
51515134
diff_key_compare_func = php_array_key_compare_string_unstable;
51525135
diff_data_compare_func = php_array_data_compare_string_unstable;
51535136
} else if (data_compare_type == DIFF_COMP_DATA_USER && key_compare_type == DIFF_COMP_KEY_INTERNAL) {
51545137
/* array_udiff_assoc() */
5155-
req_args = 3;
51565138
param_spec = "+f";
51575139
diff_key_compare_func = php_array_key_compare_string_unstable;
51585140
diff_data_compare_func = php_array_user_compare_unstable;
51595141
fci_data = &fci1;
51605142
fci_data_cache = &fci1_cache;
51615143
} else if (data_compare_type == DIFF_COMP_DATA_INTERNAL && key_compare_type == DIFF_COMP_KEY_USER) {
51625144
/* array_diff_uassoc() or array_diff_ukey() */
5163-
req_args = 3;
51645145
param_spec = "+f";
51655146
diff_key_compare_func = php_array_user_key_compare_unstable;
51665147
diff_data_compare_func = php_array_data_compare_string_unstable;
51675148
fci_key = &fci1;
51685149
fci_key_cache = &fci1_cache;
51695150
} else if (data_compare_type == DIFF_COMP_DATA_USER && key_compare_type == DIFF_COMP_KEY_USER) {
51705151
/* array_udiff_uassoc() */
5171-
req_args = 4;
51725152
param_spec = "+ff";
51735153
diff_key_compare_func = php_array_user_key_compare_unstable;
51745154
diff_data_compare_func = php_array_user_compare_unstable;
@@ -5181,11 +5161,6 @@ static void php_array_diff(INTERNAL_FUNCTION_PARAMETERS, int behavior, int data_
51815161
return;
51825162
}
51835163

5184-
if (ZEND_NUM_ARGS() < req_args) {
5185-
zend_argument_count_error("At least %d parameters are required, %d given", req_args, ZEND_NUM_ARGS());
5186-
RETURN_THROWS();
5187-
}
5188-
51895164
if (zend_parse_parameters(ZEND_NUM_ARGS(), param_spec, &args, &arr_argc, &fci1, &fci1_cache, &fci2, &fci2_cache) == FAILURE) {
51905165
RETURN_THROWS();
51915166
}
@@ -5377,11 +5352,6 @@ PHP_FUNCTION(array_diff)
53775352
zend_long idx;
53785353
zval dummy;
53795354

5380-
if (ZEND_NUM_ARGS() < 2) {
5381-
zend_argument_count_error("At least 2 parameters are required, %d given", ZEND_NUM_ARGS());
5382-
RETURN_THROWS();
5383-
}
5384-
53855355
ZEND_PARSE_PARAMETERS_START(1, -1)
53865356
Z_PARAM_VARIADIC('+', args, argc)
53875357
ZEND_PARSE_PARAMETERS_END();

ext/standard/basic_functions.stub.php

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -199,26 +199,26 @@ function array_intersect_uassoc(array $array1, array $array2, ...$rest): array {
199199
/** @param array|callable $rest */
200200
function array_uintersect_uassoc(array $array1, array $array2, ...$rest): array {}
201201

202-
function array_diff_key(array $array1, array $array2, array ...$arrays): array {}
202+
function array_diff_key(array $array, array ...$arrays): array {}
203203

204204
/** @param array|callable $rest */
205-
function array_diff_ukey(array $array1, array $array2, ...$rest): array {}
205+
function array_diff_ukey(array $array, ...$rest): array {}
206206

207-
function array_diff(array $array1, array $array2, array ...$arrays): array {}
207+
function array_diff(array $array, array ...$arrays): array {}
208208

209209
/** @param array|callable $rest */
210-
function array_udiff(array $array1, array $array2, ...$rest): array {}
210+
function array_udiff(array $array, ...$rest): array {}
211211

212-
function array_diff_assoc(array $array1, array $array2, array ...$arrays): array {}
212+
function array_diff_assoc(array $array, array ...$arrays): array {}
213213

214214
/** @param array|callable $rest */
215-
function array_diff_uassoc(array $array1, array $array2, ...$rest): array {}
215+
function array_diff_uassoc(array $array, ...$rest): array {}
216216

217217
/** @param array|callable $rest */
218-
function array_udiff_assoc(array $array1, array $array2, ...$rest): array {}
218+
function array_udiff_assoc(array $array, ...$rest): array {}
219219

220220
/** @param array|callable $rest */
221-
function array_udiff_uassoc(array $array1, array $array2, ...$rest): array {}
221+
function array_udiff_uassoc(array $array, ...$rest): array {}
222222

223223
/**
224224
* @param array $array1

ext/standard/basic_functions_arginfo.h

Lines changed: 15 additions & 9 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: c51ad7a5f254f8d28f2b2c0b46e214c44f0f96cf */
2+
* Stub hash: 07205773da4b7c010ed6c9119e3d0b2650bee544 */
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)
@@ -297,21 +297,27 @@ ZEND_END_ARG_INFO()
297297

298298
#define arginfo_array_uintersect_uassoc arginfo_array_intersect_ukey
299299

300-
#define arginfo_array_diff_key arginfo_array_intersect_key
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()
301304

302-
#define arginfo_array_diff_ukey arginfo_array_intersect_ukey
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()
303309

304-
#define arginfo_array_diff arginfo_array_intersect_key
310+
#define arginfo_array_diff arginfo_array_diff_key
305311

306-
#define arginfo_array_udiff arginfo_array_intersect_ukey
312+
#define arginfo_array_udiff arginfo_array_diff_ukey
307313

308-
#define arginfo_array_diff_assoc arginfo_array_intersect_key
314+
#define arginfo_array_diff_assoc arginfo_array_diff_key
309315

310-
#define arginfo_array_diff_uassoc arginfo_array_intersect_ukey
316+
#define arginfo_array_diff_uassoc arginfo_array_diff_ukey
311317

312-
#define arginfo_array_udiff_assoc arginfo_array_intersect_ukey
318+
#define arginfo_array_udiff_assoc arginfo_array_diff_ukey
313319

314-
#define arginfo_array_udiff_uassoc arginfo_array_intersect_ukey
320+
#define arginfo_array_udiff_uassoc arginfo_array_diff_ukey
315321

316322
ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(arginfo_array_multisort, 0, 1, _IS_BOOL, 0)
317323
ZEND_ARG_INFO(ZEND_SEND_PREFER_REF, array1)

ext/standard/tests/array/array_diff_1.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,5 @@ try {
1515
echo "OK!";
1616
?>
1717
--EXPECT--
18-
array_diff(): Argument #2 ($array2) must be of type array, int given
18+
array_diff(): Argument #2 must be of type array, int given
1919
OK!

ext/standard/tests/array/array_diff_assoc_error.phpt

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

ext/standard/tests/array/array_diff_assoc_variation1.phpt

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -100,80 +100,80 @@ echo "Done";
100100
*** Testing array_diff_assoc() : usage variations ***
101101

102102
-- Iteration 1 --
103-
array_diff_assoc(): Argument #1 ($array1) must be of type array, int given
103+
array_diff_assoc(): Argument #1 ($array) must be of type array, int given
104104

105105
-- Iteration 2 --
106-
array_diff_assoc(): Argument #1 ($array1) must be of type array, int given
106+
array_diff_assoc(): Argument #1 ($array) must be of type array, int given
107107

108108
-- Iteration 3 --
109-
array_diff_assoc(): Argument #1 ($array1) must be of type array, int given
109+
array_diff_assoc(): Argument #1 ($array) must be of type array, int given
110110

111111
-- Iteration 4 --
112-
array_diff_assoc(): Argument #1 ($array1) must be of type array, int given
112+
array_diff_assoc(): Argument #1 ($array) must be of type array, int given
113113

114114
-- Iteration 5 --
115-
array_diff_assoc(): Argument #1 ($array1) must be of type array, float given
115+
array_diff_assoc(): Argument #1 ($array) must be of type array, float given
116116

117117
-- Iteration 6 --
118-
array_diff_assoc(): Argument #1 ($array1) must be of type array, float given
118+
array_diff_assoc(): Argument #1 ($array) must be of type array, float given
119119

120120
-- Iteration 7 --
121-
array_diff_assoc(): Argument #1 ($array1) must be of type array, float given
121+
array_diff_assoc(): Argument #1 ($array) must be of type array, float given
122122

123123
-- Iteration 8 --
124-
array_diff_assoc(): Argument #1 ($array1) must be of type array, float given
124+
array_diff_assoc(): Argument #1 ($array) must be of type array, float given
125125

126126
-- Iteration 9 --
127-
array_diff_assoc(): Argument #1 ($array1) must be of type array, float given
127+
array_diff_assoc(): Argument #1 ($array) must be of type array, float given
128128

129129
-- Iteration 10 --
130-
array_diff_assoc(): Argument #1 ($array1) must be of type array, null given
130+
array_diff_assoc(): Argument #1 ($array) must be of type array, null given
131131

132132
-- Iteration 11 --
133-
array_diff_assoc(): Argument #1 ($array1) must be of type array, null given
133+
array_diff_assoc(): Argument #1 ($array) must be of type array, null given
134134

135135
-- Iteration 12 --
136-
array_diff_assoc(): Argument #1 ($array1) must be of type array, bool given
136+
array_diff_assoc(): Argument #1 ($array) must be of type array, bool given
137137

138138
-- Iteration 13 --
139-
array_diff_assoc(): Argument #1 ($array1) must be of type array, bool given
139+
array_diff_assoc(): Argument #1 ($array) must be of type array, bool given
140140

141141
-- Iteration 14 --
142-
array_diff_assoc(): Argument #1 ($array1) must be of type array, bool given
142+
array_diff_assoc(): Argument #1 ($array) must be of type array, bool given
143143

144144
-- Iteration 15 --
145-
array_diff_assoc(): Argument #1 ($array1) must be of type array, bool given
145+
array_diff_assoc(): Argument #1 ($array) must be of type array, bool given
146146

147147
-- Iteration 16 --
148-
array_diff_assoc(): Argument #1 ($array1) must be of type array, string given
148+
array_diff_assoc(): Argument #1 ($array) must be of type array, string given
149149

150150
-- Iteration 17 --
151-
array_diff_assoc(): Argument #1 ($array1) must be of type array, string given
151+
array_diff_assoc(): Argument #1 ($array) must be of type array, string given
152152

153153
-- Iteration 18 --
154-
array_diff_assoc(): Argument #1 ($array1) must be of type array, string given
154+
array_diff_assoc(): Argument #1 ($array) must be of type array, string given
155155

156156
-- Iteration 19 --
157-
array_diff_assoc(): Argument #1 ($array1) must be of type array, string given
157+
array_diff_assoc(): Argument #1 ($array) must be of type array, string given
158158

159159
-- Iteration 20 --
160-
array_diff_assoc(): Argument #1 ($array1) must be of type array, string given
160+
array_diff_assoc(): Argument #1 ($array) must be of type array, string given
161161

162162
-- Iteration 21 --
163-
array_diff_assoc(): Argument #1 ($array1) must be of type array, string given
163+
array_diff_assoc(): Argument #1 ($array) must be of type array, string given
164164

165165
-- Iteration 22 --
166-
array_diff_assoc(): Argument #1 ($array1) must be of type array, string given
166+
array_diff_assoc(): Argument #1 ($array) must be of type array, string given
167167

168168
-- Iteration 23 --
169-
array_diff_assoc(): Argument #1 ($array1) must be of type array, classA given
169+
array_diff_assoc(): Argument #1 ($array) must be of type array, classA given
170170

171171
-- Iteration 24 --
172-
array_diff_assoc(): Argument #1 ($array1) must be of type array, null given
172+
array_diff_assoc(): Argument #1 ($array) must be of type array, null given
173173

174174
-- Iteration 25 --
175-
array_diff_assoc(): Argument #1 ($array1) must be of type array, null given
175+
array_diff_assoc(): Argument #1 ($array) must be of type array, null given
176176

177177
-- Iteration 26 --
178-
array_diff_assoc(): Argument #1 ($array1) must be of type array, resource given
178+
array_diff_assoc(): Argument #1 ($array) must be of type array, resource given
179179
Done

0 commit comments

Comments
 (0)