PHP字符串包含整数

时间:2013-06-24 12:23:39

标签: php mysql

我有以下字符串如下:

1BG200,1M400,1BA1000

我想将上述字符串与Desc Order ...

进行比较

代码:

$sql = "SELECT * FROM collected WHERE c_no BETWEEN '".$from."' AND '".$to."' ORDER BY c_no Desc";

输出:

1M400
1BG200
1BA1000 

它应该是1000更大,然后400,200 ..我怎么能比较它们?我认为比较包含整数的字符串是不对的!我无法找到解决问题的正确方法吗?

有人建议使用preg_matchsubstr ..但正如您所看到的那样,有单个和双重字符ex(M和BG)。

抱歉,我不熟悉PHP ..请帮忙!

5 个答案:

答案 0 :(得分:3)

您可以使用自定义排序,仅查看数字部分

function cmp($a, $b)
{
    $numa = intval(preg_replace('/[0-9]*[A-Z]+/', '', $a));
    $numb = intval(preg_replace('/[0-9]*[A-Z]+/', '', $b));
    if($a == $b) return 0;
    return ($a < $b) ? -1 : 1;
}

//Now get the list and sort
usort($list, "cmp");

答案 1 :(得分:2)

您可以使用preg_replace('/[0-9][A-Z]+/', '', $var)删除第一个号码,然后删除一个以上的字母,然后使用php usort

答案 2 :(得分:1)

您可以为MySQL添加自定义功能。找到一个看起来可能会删除所有非数字字符MySQL strip non-numeric characters to compare

如果您决定使用限制/偏移,由于返回了大量结果,我强烈建议这样做,将所有内容都带回php并进行排序。否则你必须把所有东西都拉回到PHP然后拼接一个数组,此时我觉得这将是对资源的低效使用。

或者,如果这是一个可行的选项,您可以在表中添加一个排序列,以便您可以更好地利用MySQL中的索引,这取决于您的记录集可能会产生巨大的性能差异。

答案 3 :(得分:0)

您可以将用户定义的preg-functions添加到您的mysql(https://github.com/mysqludf/lib_mysqludf_preg)。 然后在order by by子句中使用PREG_CAPTURE。

答案 4 :(得分:0)

一般来说,preg很贵。为了从给定的模式中获得一个数字,我会做这样的事情:

digitstri='1M400'; // just an example
number=intval(is_number(digitstri{2})?substr(digitstri,2):substr(digitstri,3))

我认为,从那里排序是明确的......