自然地比较两个字母数字字符串,看看其中一个是否小于另一个

问题描述 投票:0回答:6

我有 2 根弦:

$string_1 = 'c5';
$string_2 = 'c6';

我想检查

$string_2
是否出现在 afterbefore
$string_1
(如果两者都按字母顺序排序)。

所以在上面的例子中,

$string_2
出现在之后
$string_1
。但如果
$string_2
的值为
c2
,那么它就会变成
$string_1
之前...

使用布尔结果进行此检查的可靠方法是什么?

到目前为止我已经尝试过的事情

我可以将字符串添加到数组中,按字母顺序对数组进行排序,然后检查

$string_2
是否为
$key
0
1

编辑

请注意,

c2
应该出现在之前
c11

php string comparison alphanumeric natural-sort
6个回答
3
投票

创建数组,使用 natsort 对它进行排序,并获取值较小的变量的名称

$string_1 = 'c5';
$string_2 = 'c6';
$res = compact('string_1', 'string_2'); // ['string_1' => 'c5', 'string_2' => 'c6']
natsort($res);
echo key($res); // name of variable with less value  

演示


2
投票

如果您使用的是 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

1
投票

使用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';
}

0
投票

不确定这是否是您问题的答案,但如果我理解正确,我会编写这样的函数:

<?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));

0
投票

我想你可以使用

int
strcasecmp
( string $str1 , string $str2 )

https://eval.in/1053409

<?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

之后

0
投票

有一个专门用于此任务的本机函数——它提供了 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
© www.soinside.com 2019 - 2024. All rights reserved.