@@ -103,6 +103,7 @@ PHP_MINIT_FUNCTION(array) /* {{{ */
103103
104104 REGISTER_LONG_CONSTANT ("SORT_REGULAR" , PHP_SORT_REGULAR , CONST_CS | CONST_PERSISTENT );
105105 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 );
106107 REGISTER_LONG_CONSTANT ("SORT_STRING" , PHP_SORT_STRING , CONST_CS | CONST_PERSISTENT );
107108 REGISTER_LONG_CONSTANT ("SORT_LOCALE_STRING" , PHP_SORT_LOCALE_STRING , CONST_CS | CONST_PERSISTENT );
108109 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
349350}
350351/* }}} */
351352
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+
352369static zend_always_inline int php_array_data_compare_numeric_unstable_i (Bucket * f , Bucket * s ) /* {{{ */
353370{
354371 return numeric_compare_function (& f -> val , & s -> val );
@@ -405,6 +422,7 @@ DEFINE_SORT_VARIANTS(key_compare_string_case);
405422DEFINE_SORT_VARIANTS (key_compare_string );
406423DEFINE_SORT_VARIANTS (key_compare_string_locale );
407424DEFINE_SORT_VARIANTS (data_compare );
425+ DEFINE_SORT_VARIANTS (data_compare_strict );
408426DEFINE_SORT_VARIANTS (data_compare_numeric );
409427DEFINE_SORT_VARIANTS (data_compare_string_case );
410428DEFINE_SORT_VARIANTS (data_compare_string );
@@ -527,6 +545,14 @@ static bucket_compare_func_t php_get_data_compare_func(zend_long sort_type, int
527545 }
528546 break ;
529547
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+
530556 case PHP_SORT_REGULAR :
531557 default :
532558 if (reverse ) {
@@ -591,6 +617,14 @@ static bucket_compare_func_t php_get_data_compare_func_unstable(zend_long sort_t
591617 }
592618 break ;
593619
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+
594628 case PHP_SORT_REGULAR :
595629 default :
596630 if (reverse ) {
0 commit comments