Fix #20262: array_unique() with SORT_REGULAR misses duplicates #20304
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Fixed transitivity violation in zendi_smart_strcmp() that caused sort() and array_unique() to produce incorrect results with mixed numeric and alphanumeric strings.
When both strings have numeric prefixes, the comparison now consistently uses numeric comparison, with trailing data as a tie-breaker when the numeric values are equal.
The bug occurred because the comparison function would:
This violated transitivity (if a<b and b<c, then a<c must hold), causing sort() to fail to group equal values and array_unique() to miss duplicates.
The fix ensures that when both strings have numeric prefixes (even with trailing data), numeric comparison is always used. When numeric values are equal, strings without trailing data are considered "less than" strings with trailing data as a tie-breaker.
This maintains backward compatibility while ensuring comparison transitivity.