|
42 | 42 | #include "zend_exceptions.h"
|
43 | 43 | #include "ext/spl/spl_array.h"
|
44 | 44 | #include "ext/random/php_random.h"
|
45 |
| -#include "Zend/zend_strictmap.h" |
46 | 45 |
|
47 | 46 | /* {{{ defines */
|
48 | 47 |
|
@@ -4560,42 +4559,6 @@ PHP_FUNCTION(array_unique)
|
4560 | 4559 | return;
|
4561 | 4560 | }
|
4562 | 4561 |
|
4563 |
| - if (sort_type == PHP_ARRAY_UNIQUE_IDENTICAL) { |
4564 |
| - zend_long num_key; |
4565 |
| - zend_string *str_key; |
4566 |
| - zval *val; |
4567 |
| - zend_strictmap seen; |
4568 |
| - |
4569 |
| - zend_strictmap_init(&seen); |
4570 |
| - |
4571 |
| - array_init(return_value); |
4572 |
| - |
4573 |
| - ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL_P(array), num_key, str_key, val) { |
4574 |
| - zval dummy; |
4575 |
| - ZVAL_TRUE(&dummy); |
4576 |
| - zval *val_deref = val; |
4577 |
| - ZVAL_DEREF(val_deref); |
4578 |
| - bool added = zend_strictmap_insert(&seen, val_deref, &dummy); |
4579 |
| - |
4580 |
| - if (added) { |
4581 |
| - /* First occurrence of the value */ |
4582 |
| - if (UNEXPECTED(Z_ISREF_P(val) && Z_REFCOUNT_P(val) == 1)) { |
4583 |
| - ZVAL_DEREF(val); |
4584 |
| - } |
4585 |
| - Z_TRY_ADDREF_P(val); |
4586 |
| - |
4587 |
| - if (str_key) { |
4588 |
| - zend_hash_add_new(Z_ARRVAL_P(return_value), str_key, val); |
4589 |
| - } else { |
4590 |
| - zend_hash_index_add_new(Z_ARRVAL_P(return_value), num_key, val); |
4591 |
| - } |
4592 |
| - } |
4593 |
| - } ZEND_HASH_FOREACH_END(); |
4594 |
| - |
4595 |
| - zend_strictmap_dtor(&seen); |
4596 |
| - return; |
4597 |
| - } |
4598 |
| - |
4599 | 4562 | cmp = php_get_data_compare_func_unstable(sort_type, 0);
|
4600 | 4563 |
|
4601 | 4564 | RETVAL_ARR(zend_array_dup(Z_ARRVAL_P(array)));
|
@@ -6492,3 +6455,59 @@ PHP_FUNCTION(array_combine)
|
6492 | 6455 | } ZEND_HASH_FOREACH_END();
|
6493 | 6456 | }
|
6494 | 6457 | /* }}} */
|
| 6458 | + |
| 6459 | +static zend_always_inline void list_assoc_unique(INTERNAL_FUNCTION_PARAMETERS, bool preserve_keys) |
| 6460 | +{ |
| 6461 | + zval *array; |
| 6462 | + |
| 6463 | + ZEND_PARSE_PARAMETERS_START(1, 1) |
| 6464 | + Z_PARAM_ARRAY(array) |
| 6465 | + ZEND_PARSE_PARAMETERS_END(); |
| 6466 | + |
| 6467 | + zend_long num_key; |
| 6468 | + zend_string *str_key; |
| 6469 | + zval *val; |
| 6470 | + zend_strictmap seen; |
| 6471 | + |
| 6472 | + zend_strictmap_init(&seen); |
| 6473 | + |
| 6474 | + array_init(return_value); |
| 6475 | + |
| 6476 | + ZEND_HASH_FOREACH_KEY_VAL(Z_ARRVAL_P(array), num_key, str_key, val) { |
| 6477 | + zval dummy; |
| 6478 | + ZVAL_TRUE(&dummy); |
| 6479 | + zval *val_deref = val; |
| 6480 | + ZVAL_DEREF(val_deref); |
| 6481 | + bool added = zend_strictmap_insert(&seen, val_deref, &dummy); |
| 6482 | + |
| 6483 | + if (added) { |
| 6484 | + /* First occurrence of the value */ |
| 6485 | + if (UNEXPECTED(Z_ISREF_P(val) && Z_REFCOUNT_P(val) == 1)) { |
| 6486 | + ZVAL_DEREF(val); |
| 6487 | + } |
| 6488 | + Z_TRY_ADDREF_P(val); |
| 6489 | + |
| 6490 | + if (preserve_keys) { |
| 6491 | + if (str_key) { |
| 6492 | + zend_hash_add_new(Z_ARRVAL_P(return_value), str_key, val); |
| 6493 | + } else { |
| 6494 | + zend_hash_index_add_new(Z_ARRVAL_P(return_value), num_key, val); |
| 6495 | + } |
| 6496 | + } else { |
| 6497 | + zend_hash_next_index_insert(Z_ARRVAL_P(return_value), val); |
| 6498 | + } |
| 6499 | + } |
| 6500 | + } ZEND_HASH_FOREACH_END(); |
| 6501 | + |
| 6502 | + zend_strictmap_dtor(&seen); |
| 6503 | +} |
| 6504 | + |
| 6505 | +ZEND_FUNCTION(List_unique) |
| 6506 | +{ |
| 6507 | + list_assoc_unique(INTERNAL_FUNCTION_PARAM_PASSTHRU, /* preserve_keys */ false); |
| 6508 | +} |
| 6509 | + |
| 6510 | +ZEND_FUNCTION(Assoc_unique) |
| 6511 | +{ |
| 6512 | + list_assoc_unique(INTERNAL_FUNCTION_PARAM_PASSTHRU, /* preserve_keys */ true); |
| 6513 | +} |
0 commit comments