summaryrefslogtreecommitdiff
path: root/ext/standard/array.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/standard/array.c')
-rw-r--r--ext/standard/array.c62
1 files changed, 61 insertions, 1 deletions
diff --git a/ext/standard/array.c b/ext/standard/array.c
index 24c4b0880e..6eb71efa92 100644
--- a/ext/standard/array.c
+++ b/ext/standard/array.c
@@ -4814,7 +4814,7 @@ static void php_array_intersect(INTERNAL_FUNCTION_PARAMETERS, int behavior, int
ZVAL_UNDEF(&list->val);
if (hash->nNumOfElements > 1) {
if (behavior == INTERSECT_NORMAL) {
- zend_sort((void *) lists[i], hash->nNumOfElements,
+ zend_sort((void *) lists[i], hash->nNumOfElements,
sizeof(Bucket), intersect_data_compare_func, (swap_func_t)zend_hash_bucket_swap);
} else if (behavior & INTERSECT_ASSOC) { /* triggered also when INTERSECT_KEY */
zend_sort((void *) lists[i], hash->nNumOfElements,
@@ -5390,6 +5390,66 @@ PHP_FUNCTION(array_diff)
RETURN_NULL();
}
+ num = zend_hash_num_elements(Z_ARRVAL(args[0]));
+ if (num == 0) {
+ for (i = 1; i < argc; i++) {
+ if (Z_TYPE(args[i]) != IS_ARRAY) {
+ php_error_docref(NULL, E_WARNING, "Argument #%d is not an array", i + 1);
+ RETURN_NULL();
+ }
+ }
+ ZVAL_EMPTY_ARRAY(return_value);
+ return;
+ } else if (num == 1) {
+ int found = 0;
+ zend_string *search_str, *tmp_search_str;
+
+ value = NULL;
+ ZEND_HASH_FOREACH_VAL_IND(Z_ARRVAL(args[0]), value) {
+ break;
+ } ZEND_HASH_FOREACH_END();
+
+ if (!value) {
+ for (i = 1; i < argc; i++) {
+ if (Z_TYPE(args[i]) != IS_ARRAY) {
+ php_error_docref(NULL, E_WARNING, "Argument #%d is not an array", i + 1);
+ RETURN_NULL();
+ }
+ }
+ ZVAL_EMPTY_ARRAY(return_value);
+ return;
+ }
+
+ search_str = zval_get_tmp_string(value, &tmp_search_str);
+
+ for (i = 1; i < argc; i++) {
+ if (Z_TYPE(args[i]) != IS_ARRAY) {
+ php_error_docref(NULL, E_WARNING, "Argument #%d is not an array", i + 1);
+ RETURN_NULL();
+ }
+ if (!found) {
+ ZEND_HASH_FOREACH_VAL_IND(Z_ARRVAL(args[i]), value) {
+ str = zval_get_tmp_string(value, &tmp_str);
+ if (zend_string_equals(search_str, str)) {
+ zend_tmp_string_release(tmp_str);
+ found = 1;
+ break;
+ }
+ zend_tmp_string_release(tmp_str);
+ } ZEND_HASH_FOREACH_END();
+ }
+ }
+
+ zend_tmp_string_release(tmp_search_str);
+
+ if (found) {
+ ZVAL_EMPTY_ARRAY(return_value);
+ } else {
+ ZVAL_COPY(return_value, &args[0]);
+ }
+ return;
+ }
+
/* count number of elements */
num = 0;
for (i = 1; i < argc; i++) {