2013-06-24 11 views
6

が含まれていますI次のように次の文字列をしました:PHPの文字列は整数

1BG200,1M400,1BA1000 

そして、私はDESC順序に上記の文字列を比較したい...

コード:

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

出力:

1M400 
1BG200 
1BA1000 

It 1000でなければならない、次に400,200 ..どのように私はそれらを比較することができますか?整数を含む文字列を比較するのは正しいとは思わない!私の問題に正しい解決策が見つからないのですか?

preg_matchまたはsubstrを使用している人もいますが、ex(MとBG)は一文字と二重文字があります。

申し訳ありませんが、私はPHPに精通していません。

+0

ので、ソートアルゴリズムのためにのみ依存部分は終了です数字シーケンス? – Daniel

+0

@ダニエルまあ、私は完全な文字列を比較したかったが、それは私と一緒に働いていないようだ。ですから、私は文字を無視して数字シーケンスをソートしたいと思っています。 – Alihamra

答えて

3

あなたは、あなたのmysql(https://github.com/mysqludf/lib_mysqludf_preg)にユーザー定義のプレグ-機能を追加することができ、数値部分

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)を使用して最初の数字とそれ以上の文字を削除してから、usortを使用できます。

0

でのみ見て、カスタムの並べ替えを使用することができます。 次にorder by節でPREG_CAPTUREを使用します。

1

MySQLにカスタム関数を追加することができます。すべての非数字文字を取り除くことができるように見えるものが見つかりましたMySQL strip non-numeric characters to compare

大量の結果が返されるためにlimit/offsetを使用することを決断した場合は、すべてをPHPに戻してソートすることをお勧めします。さもなければ、PHPにすべてを戻してから配列をスプライスする必要があります。その時点で、リソースの非効率的な使用と思われます。

また、テーブルにソートカラムを追加することもできます。これが可能な場合は、レコードセットによって性能が大きく異なる可能性があるMySQLのインデックスをより有効に活用できます。

+0

+1ソート列 –

0

一般的にプレグは高価である。私はこのようなものだろう与えられたパターンから数得るために:私は思う

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

を、そこからソートすることは明らかである...

関連する問題