diff --git a/ext/standard/array.c b/ext/standard/array.c index 6e4dc100fdd..7571ec8550f 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -2978,7 +2978,7 @@ PHP_FUNCTION(array_unique) if (Z_ARRVAL_P(return_value) == &EG(symbol_table)) { zend_u_delete_global_variable(p->key.type, ZSTR(p->key.arKey.s), p->nKeyLength - 1 TSRMLS_CC); } else { - zend_u_hash_del(Z_ARRVAL_P(return_value), p->key.type, ZSTR(p->key.arKey.s), p->nKeyLength); + zend_u_hash_quick_del(Z_ARRVAL_P(return_value), p->key.type, ZSTR(p->key.arKey.s), p->nKeyLength, p->h); } } } @@ -3075,10 +3075,12 @@ static void php_array_intersect_key(INTERNAL_FUNCTION_PARAMETERS, int data_compa } } - if (Z_TYPE_PP(args[0]) != IS_ARRAY) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Argument #1 is not an array"); - RETVAL_NULL(); - goto out; + for (i = 0; i < argc; i++) { + if (Z_TYPE_PP(args[i]) != IS_ARRAY) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Argument #%d is not an array", i + 1); + RETVAL_NULL(); + goto out; + } } array_init(return_value); @@ -3087,12 +3089,7 @@ static void php_array_intersect_key(INTERNAL_FUNCTION_PARAMETERS, int data_compa if (p->nKeyLength == 0) { ok = 1; for (i = 1; i < argc; i++) { - if (Z_TYPE_PP(args[i]) != IS_ARRAY) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Argument #%d is not an array", i + 1); - zval_dtor(return_value); - RETVAL_NULL(); - goto out; - } else if (zend_hash_index_find(Z_ARRVAL_PP(args[i]), p->h, (void**)&data) == FAILURE || + if (zend_hash_index_find(Z_ARRVAL_PP(args[i]), p->h, (void**)&data) == FAILURE || (intersect_data_compare_func && intersect_data_compare_func((zval**)p->pData, data TSRMLS_CC) != 0) ) { @@ -3107,12 +3104,7 @@ static void php_array_intersect_key(INTERNAL_FUNCTION_PARAMETERS, int data_compa } else { ok = 1; for (i = 1; i < argc; i++) { - if (Z_TYPE_PP(args[i]) != IS_ARRAY) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Argument #%d is not an array", i + 1); - zval_dtor(return_value); - RETVAL_NULL(); - goto out; - } else if (zend_u_hash_quick_find(Z_ARRVAL_PP(args[i]), p->key.type, ZSTR(p->key.arKey.s), p->nKeyLength, p->h, (void**)&data) == FAILURE || + if (zend_u_hash_quick_find(Z_ARRVAL_PP(args[i]), p->key.type, ZSTR(p->key.arKey.s), p->nKeyLength, p->h, (void**)&data) == FAILURE || (intersect_data_compare_func && intersect_data_compare_func((zval**)p->pData, data TSRMLS_CC) != 0) ) { @@ -3342,7 +3334,7 @@ static void php_array_intersect(INTERNAL_FUNCTION_PARAMETERS, int behavior, int if (p->nKeyLength == 0) { zend_hash_index_del(Z_ARRVAL_P(return_value), p->h); } else { - zend_u_hash_del(Z_ARRVAL_P(return_value), p->key.type, ZSTR(p->key.arKey.s), p->nKeyLength); + zend_u_hash_quick_del(Z_ARRVAL_P(return_value), p->key.type, ZSTR(p->key.arKey.s), p->nKeyLength, p->h); } } } @@ -3358,7 +3350,7 @@ static void php_array_intersect(INTERNAL_FUNCTION_PARAMETERS, int behavior, int if (p->nKeyLength == 0) { zend_hash_index_del(Z_ARRVAL_P(return_value), p->h); } else { - zend_u_hash_del(Z_ARRVAL_P(return_value), p->key.type, ZSTR(p->key.arKey.s), p->nKeyLength); + zend_u_hash_quick_del(Z_ARRVAL_P(return_value), p->key.type, ZSTR(p->key.arKey.s), p->nKeyLength, p->h); } if (!*++ptrs[0]) { goto out; @@ -3501,10 +3493,12 @@ static void php_array_diff_key(INTERNAL_FUNCTION_PARAMETERS, int data_compare_ty } } - if (Z_TYPE_PP(args[0]) != IS_ARRAY) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Argument #1 is not an array"); - RETVAL_NULL(); - goto out; + for (i = 0; i < argc; i++) { + if (Z_TYPE_PP(args[i]) != IS_ARRAY) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "Argument #%d is not an array", i + 1); + RETVAL_NULL(); + goto out; + } } array_init(return_value); @@ -3513,12 +3507,7 @@ static void php_array_diff_key(INTERNAL_FUNCTION_PARAMETERS, int data_compare_ty if (p->nKeyLength == 0) { ok = 1; for (i = 1; i < argc; i++) { - if (Z_TYPE_PP(args[i]) != IS_ARRAY) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Argument #%d is not an array", i + 1); - zval_dtor(return_value); - RETVAL_NULL(); - goto out; - } else if (zend_hash_index_find(Z_ARRVAL_PP(args[i]), p->h, (void**)&data) == SUCCESS && + if (zend_hash_index_find(Z_ARRVAL_PP(args[i]), p->h, (void**)&data) == SUCCESS && (!diff_data_compare_func || diff_data_compare_func((zval**)p->pData, data TSRMLS_CC) == 0) ) { @@ -3533,12 +3522,7 @@ static void php_array_diff_key(INTERNAL_FUNCTION_PARAMETERS, int data_compare_ty } else { ok = 1; for (i = 1; i < argc; i++) { - if (Z_TYPE_PP(args[i]) != IS_ARRAY) { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Argument #%d is not an array", i + 1); - zval_dtor(return_value); - RETVAL_NULL(); - goto out; - } else if (zend_u_hash_quick_find(Z_ARRVAL_PP(args[i]), p->key.type, ZSTR(p->key.arKey.s), p->nKeyLength, p->h, (void**)&data) == SUCCESS && + if (zend_u_hash_quick_find(Z_ARRVAL_PP(args[i]), p->key.type, ZSTR(p->key.arKey.s), p->nKeyLength, p->h, (void**)&data) == SUCCESS && (!diff_data_compare_func || diff_data_compare_func((zval**)p->pData, data TSRMLS_CC) == 0) ) { @@ -3780,7 +3764,7 @@ static void php_array_diff(INTERNAL_FUNCTION_PARAMETERS, int behavior, int data_ if (p->nKeyLength == 0) { zend_hash_index_del(Z_ARRVAL_P(return_value), p->h); } else { - zend_u_hash_del(Z_ARRVAL_P(return_value), p->key.type, ZSTR(p->key.arKey.s), p->nKeyLength); + zend_u_hash_quick_del(Z_ARRVAL_P(return_value), p->key.type, ZSTR(p->key.arKey.s), p->nKeyLength, p->h); } if (!*++ptrs[0]) { goto out;