2011-07-10 7 views
2

MySQLクエリからPHPに$ result変数があります& 2つの異なる列に並べ替えることにしました。MySQLクエリをやり直さなくてもPHPの2列にソート

私はいつでもユーザーが別のソート方法をクリックするので、毎回ORDER BY ....でMySQLクエリをやり直す必要はありません。

+0

テーブルにはいくつの列がありますか? – Shef

+0

6つの列があります。 – Glyph

+0

私はあなたに3つの列の答えを与えました。 6つの列に合わせて調整できない場合は、列名を示すように回答を編集してください。 – Shef

答えて

2

MySQLで注文するのが効率的ですが、PHPで実行したい場合は、usortをチェックしてください。コールバック関数を使用して配列を並べ替えることができます。

あなたの$結果が連想データベース行の配列である場合は、ここでは文字列の列「foo」でにソートするusortを使用して、非常に単純な例だ...

//sort on string column 
function sortStringFoo($a, $b) 
{ 
    return strcmp($a['foo'], $b['foo']); 
} 
usort($result, 'sortStringFoo'); 

は、ここであなたがしたい方法です数値ソート...

//sort on numeric column 
function sortNumericBar($a, $b) 
{ 
    if ($a['bar'] == $b['bar']) { 
     return 0; 
    } 
    return ($a['bar'] < $b['bar']) ? -1 : 1; 
} 
usort($result, 'sortNumericBar'); 

これはusortの使用方法の基本を示していますが、複数の列を一度に並べ替える方法はありますか?ここでは、...「foo」とし、「バー」上にソートすることにより、これを説明するために私たちの比較コールバックを組み合わせることができる方法だ

function sortFooBar($a,$b) 
{ 
    $order=sortStringFoo($a,$b); 
    if ($order==0) 
     $order=sortNumericBar($a,$b); 

    return $order; 
} 
usort($result, 'sortFooBar'); 
あなたは、単一の関数に sortFooBarをアンロールことができますが、これは技術を示し

:最初の列を比較します、同じ場合は2番目の列を比較します。

+0

早くusortを見て、約30分間試してみました。私の問題を解決する方法を見つけることができませんでした。思考力が低下する! – Glyph

+0

あなたはあなたが持っているものを投稿するべきです! –

+0

@ Paul Dixon:これもテストしましたか?それはまったく役に立たず、最後の並べ替えは前の並べ替えを "破棄"します。さらに、 'strcmp'ではソートが行われません。私のテストケースに提示されたダミーデータでテストしてください。 – Shef

-1

テーブルのすべての列を別々の列に分割し、次にarray_multisort(例3の通知)を実行することで、これを実現できます。ここではテストケースである:

<?php 
$arr = array(
    array(
     'name' => 'Maria', 
     'surname' => 'White', 
     'age' => 24 
    ), 
    array(
     'name' => 'John', 
     'surname' => 'Brown', 
     'age' => 32 
    ), 
    array(
     'name' => 'John', 
     'surname' => 'Brown', 
     'age' => 33 
    ) 
); 

$names  = array(); 
$surnames = array(); 
$ages  = array(); 

foreach($arr as $key => $row){ 
    $names[$key] = $row['name']; 
    $surnames[$key] = $row['surnames']; 
    $ages[$key]  = $row['age']; 
} 

// perform any sorting task you like 
array_multisort($names, SORT_ASC, $surnames, SORT_ASC, $ages, SORT_DESC, $arr); 

print_r($arr); 
?> 

出力は次のようになります。

Array 
(
    [0] => Array 
     (
      [name] => John 
      [surname] => Brown 
      [age] => 33 
     ) 

    [1] => Array 
     (
      [name] => John 
      [surname] => Brown 
      [age] => 32 
     ) 

    [2] => Array 
     (
      [name] => Maria 
      [surname] => White 
      [age] => 24 
     ) 

) 

あなたは配列にあなたの列を分割する場合は、あなたが任意の方向に任意の列でソートする力を持っています。

+0

@グリフ:どうぞよろしく!私の答えがあなたの問題を解決したら、私の答えの左側にある投票数の下のチェックをクリックして、それを受け入れることを検討してください。:) – Shef

+0

このテクニックは小さな配列では問題ありませんが、大きなものであれば、それらのセカンダリ配列にデータを複製するだけで無駄なので、array_multisortを使うことができます。 usortを使用すると、そのような重複がなくても、ソートは「インプレース」で行われます。 –

+0

@Paul Dixon:リソースの少ない空腹のソリューションを提供してください。私はそれを見てうれしいです。あなたの答えにあなたが提供する解決策は正確ではありません。試して。 – Shef

関連する問題