<?php
function str_compare(string $left, string $right): int
{
$length = mb_strlen($left, '8bit');
if (mb_strlen($right, '8bit') !== $length) {
throw new Exception('ct_select() expects two strings of equal length');
}
$gt = 0;
$eq = 1;
$i = $length;
while ($i > 0) {
--$i;
$leftCharCode = unpack('C', $left[$i])[1];
$rightCharCode = unpack('C', $right[$i])[1];
$gt |= (($rightCharCode - $leftCharCode) >> 8) & $eq;
$eq &= (($rightCharCode ^ $leftCharCode) -1) >> 8;
}
return ($gt + $gt + $eq) - 1;
}
var_dump(
str_compare('baaaaaaaa', 'aaaaaaaaa'),
str_compare('aaaaaaaaa', 'aaaaaaaaa'),
str_compare('aaaaaaaaa', 'baaaaaaaa')
);
- Output for 7.2.0 - 7.2.34, 7.3.0 - 7.3.33, 7.4.0 - 7.4.33, 8.0.0 - 8.0.30, 8.1.0 - 8.1.30, 8.2.0 - 8.2.25, 8.3.0 - 8.3.13
- int(1)
int(0)
int(-1)
preferences:
74.32 ms | 407 KiB | 5 Q