我有 2 根弦:
$string_1 = 'c5';
$string_2 = 'c6';
我想检查
$string_2
是否出现在 after 或 before $string_1
(如果两者都按字母顺序排序)。
所以在上面的例子中,
$string_2
出现在之后$string_1
。但如果 $string_2
的值为 c2
,那么它就会变成 $string_1
之前...
使用布尔结果进行此检查的可靠方法是什么?
我可以将字符串添加到数组中,按字母顺序对数组进行排序,然后检查
$string_2
是否为 $key
值 0
或 1
。
请注意,
c2
应该出现在之前c11
。
如果您使用的是 PHP 7+,则可以使用 spaceship 运算符
<=>
来比较两个字段。
$string_1 = 'c5';
$string_2 = 'c6';
echo ($string_1 <=> $string_2).PHP_EOL;
echo ($string_2 <=> $string_1).PHP_EOL;
echo ($string_1 <=> $string_1).PHP_EOL;
将会输出
-1 // 1st is before 2nd
1 // 2nd is before 1st
0 // 1st is same as 2nd
使用strpos()
$string_1 = "c2";
$string_2 = "c5";
$bigString = $string_1.$string_2; // Hypothetical string with string_1 and string_2 in alphabethical order in it
if(strpos($bigString, $string_1) > strpos($bigString, $string_2)) {
echo 'true';
}
else {
echo 'false';
}
不确定这是否是您问题的答案,但如果我理解正确,我会编写这样的函数:
<?php
$a = 'test';
$b = 'vest';
function comp($one, $two) {
$i = 0;
while ($i < strlen($one) && $i < strlen($two)) {
if (ord($one[$i]) > ord($two[$i])) {
return true;
} elseif (ord($one[$i]) < ord($two[$i])) {
return false;
} else {
$i++;
}
}
}
var_dump(comp($a, $b));
var_dump(comp($b, $a));
我想你可以使用
int
strcasecmp( string $str1 , string $str2 )
。
<?php
$string_1 = 'd';
$string_2 = 'c';
// Returns < 0 if str1 is less than str2; > 0 if str1 is greater than str2, and 0 if they are equal.
$return = strcasecmp($string_1, $string_2);
if($return < 0) {
echo "$string_1 is before $string_2";
} else if($return > 0) {
echo "$string_1 is after $string_2";
} else {
echo "$string_1 and $string_2 are equal";
}
d 在 c
之后
有一个专门用于此任务的本机函数——它提供了 3 路比较(没错)。
strnatcmp()
将“自然地”比较两个字符串,如果第一个值小于第二个值,则返回 -1;如果它们相同,则返回 0;如果第一个值大于第二个值,则返回 1。
但是,您希望对返回的整数进行检查取决于您。
代码:(演示)
$string_1 = 'c5';
$string_2 = 'c11';
$string_3 = 'c329';
$string_4 = 'c78';
echo "Min: " . match (strnatcmp($string_1, $string_2)) {
-1 => $string_1,
0 => 'same',
1 => $string_2
};
echo "\n---\nMin: " . match (strnatcmp($string_3, $string_4)) {
-1 => $string_3,
0 => 'same',
1 => $string_4
};
输出:
Min: c5
---
Min: c78