@@ -103,6 +103,7 @@ PHP_MINIT_FUNCTION(array) /* {{{ */
103
103
104
104
REGISTER_LONG_CONSTANT ("SORT_REGULAR" , PHP_SORT_REGULAR , CONST_CS | CONST_PERSISTENT );
105
105
REGISTER_LONG_CONSTANT ("SORT_NUMERIC" , PHP_SORT_NUMERIC , CONST_CS | CONST_PERSISTENT );
106
+ REGISTER_LONG_CONSTANT ("SORT_STRICT" , PHP_SORT_STRICT , CONST_CS | CONST_PERSISTENT );
106
107
REGISTER_LONG_CONSTANT ("SORT_STRING" , PHP_SORT_STRING , CONST_CS | CONST_PERSISTENT );
107
108
REGISTER_LONG_CONSTANT ("SORT_LOCALE_STRING" , PHP_SORT_LOCALE_STRING , CONST_CS | CONST_PERSISTENT );
108
109
REGISTER_LONG_CONSTANT ("SORT_NATURAL" , PHP_SORT_NATURAL , CONST_CS | CONST_PERSISTENT );
@@ -349,6 +350,22 @@ static zend_always_inline int php_array_data_compare_unstable_i(Bucket *f, Bucke
349
350
}
350
351
/* }}} */
351
352
353
+ static zend_always_inline int php_array_data_compare_strict_unstable_i (Bucket * f , Bucket * s ) /* {{{ */
354
+ {
355
+ if (zend_is_identical (& f -> val , & s -> val )) {
356
+ return 0 ;
357
+ }
358
+ int c = zend_compare (& f -> val , & s -> val );
359
+ if (c != 0 ) {
360
+ return c ;
361
+ }
362
+ // types must be different; compare based on type.
363
+ int t1 = Z_TYPE_P (& f -> val );
364
+ int t2 = Z_TYPE_P (& s -> val );
365
+ return (t1 < t2 ) ? -1 : 1 ;
366
+ }
367
+ /* }}} */
368
+
352
369
static zend_always_inline int php_array_data_compare_numeric_unstable_i (Bucket * f , Bucket * s ) /* {{{ */
353
370
{
354
371
return numeric_compare_function (& f -> val , & s -> val );
@@ -405,6 +422,7 @@ DEFINE_SORT_VARIANTS(key_compare_string_case);
405
422
DEFINE_SORT_VARIANTS (key_compare_string );
406
423
DEFINE_SORT_VARIANTS (key_compare_string_locale );
407
424
DEFINE_SORT_VARIANTS (data_compare );
425
+ DEFINE_SORT_VARIANTS (data_compare_strict );
408
426
DEFINE_SORT_VARIANTS (data_compare_numeric );
409
427
DEFINE_SORT_VARIANTS (data_compare_string_case );
410
428
DEFINE_SORT_VARIANTS (data_compare_string );
@@ -527,6 +545,14 @@ static bucket_compare_func_t php_get_data_compare_func(zend_long sort_type, int
527
545
}
528
546
break ;
529
547
548
+ case PHP_SORT_STRICT :
549
+ if (reverse ) {
550
+ return php_array_reverse_data_compare_strict ;
551
+ } else {
552
+ return php_array_data_compare_strict ;
553
+ }
554
+ break ;
555
+
530
556
case PHP_SORT_REGULAR :
531
557
default :
532
558
if (reverse ) {
@@ -591,6 +617,14 @@ static bucket_compare_func_t php_get_data_compare_func_unstable(zend_long sort_t
591
617
}
592
618
break ;
593
619
620
+ case PHP_SORT_STRICT :
621
+ if (reverse ) {
622
+ return php_array_reverse_data_compare_strict_unstable ;
623
+ } else {
624
+ return php_array_data_compare_strict_unstable ;
625
+ }
626
+ break ;
627
+
594
628
case PHP_SORT_REGULAR :
595
629
default :
596
630
if (reverse ) {
0 commit comments