2013-06-24 143 views
6

我有以下字符串如下:PHP字符串包含整数

1BG200,1M400,1BA1000 

我想比较上面的字符串到倒序...

代码:

$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 ..请帮助!

+0

所以,对排序算法的唯一依赖的部分是结局数字序列? – Daniel

+0

@Daniel我想比较完整的字符串,但它似乎没有与我合作。所以是的,我想忽略字母和排序数字序列。 – Alihamra

回答

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"); 
+2

此外,如果您希望前导数字成为排序算法的一部分,您可以交换''/ [^ 0-9] /“'的模式,这将基于所有数字进行排序。 – Daniel

2

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

1

您可以将自定义函数添加到您的MySQL。找到一个看起来像它可以去除所有非数字字符MySQL strip non-numeric characters to compare

我强烈建议这样做,把所有东西都带回到php并排序,如果你决定使用由于返回大量结果而导致的限制/偏移。否则,你将不得不将所有东西都拉回到PHP,然后拼接一个数组,在这一点上,我觉得这将是一个低效的资源使用。

或者,你可以添加一个排序列到你的表,如果这是一个可行的选择,让你更好地利用MySQL中的索引,这取决于你的记录集可能是一个巨大的性能差异。

+0

对于排序列+1 –

0

一般preg是昂贵的。为了从给定的模式获得了一些我会做这样的事情:

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

我认为,排序从有明确的...