2013-06-24 282 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)) 

我認爲,排序從有明確的...