2013-04-11 12 views
6

私がしようとしているのは、10進値を含む多次元配列をソートすることです。私がテストしたことから、フロートは正しく注文されることに問題があります。多次元配列を10進数値でソート

Array 
(
    [0] => Array 
     (
      [company] => Ebay 
      [weight] => 4.6 
     ) 

    [1] => Array 
     (
      [company] => Ebay 
      [weight] => 1.7 
     ) 

    [2] => Array 
     (
      [company] => Ebay 
      [weight] => 3.7 
     ) 
) 


usort($array, 'order_by_weight'); 

// Sorts DESC highest first 
function order_by_weight($a, $b) { 
    return $b['weight'] - $a['weight']; 
} 

降順でこれらの数字を並べ替えるための最良の方法は何ですか?

+0

「フロートが正しく注文されていない」---いいえ、そうではありません。何かを混乱させました。 – zerkms

+0

@zerkms私はドキュメントを誤読しているかもしれませんが、誤って順序付けされた値を誤って読んでいるわけではありません。 http://php.net/manual/en/function.usort.php。 " floatのような比較関数からの非整数値を返すと、コールバックの戻り値の整数への内部キャストが発生するので、0.99や0.1などの値が返されます両方とも等しい値を比較する0の整数値にキャストされます。 – stwhite

+0

私はあなたのコードを取ってきました、それだけで動作します:http://ideone.com/cqW85mあなたはそれを実行しようとしましたか? – zerkms

答えて

16
$arr = array(
    array('company' => 'A', 'weight' => 4.6), 
    array('company' => 'B', 'weight' => 1.7), 
    array('company' => 'C', 'weight' => 3.7), 
); 

usort($arr, 'order_by_weight'); 

function order_by_weight($a, $b) { 
    return $b['weight'] > $a['weight'] ? 1 : -1; 
} 

var_dump($arr); 

PS:それはロケット科学ではありません - あなただけの1行で無名関数でこれを行うことができ、まさにこの「トリック」http://php.net/usort

+0

私はそれがarray_multisortよりもはるかに短く、読み込み/使用が簡単です! – Benz

+0

@Benz:匿名関数を使用するとさらに短くなる可能性があります – zerkms

+0

完全に真ですが、TS PHPのバージョンはわかりませんが、匿名関数の最小PHPバージョンはPHP 5.4 。 – Benz

0

array_multisortを使用して配列を並べ替えることができます。これは多くの場合、複数の配列値を1つではなく並べ替えるために使用されます。

echo "<pre>"; 

$a = array(
    array('company' => 'ebay', 'weight' => 4.6), 
    array('company' => 'ebay', 'weight' => 1.7), 
    array('company' => 'ebay', 'weight' => 3.7), 
    array('company' => 'ebay', 'weight' => 2.7), 
    array('company' => 'ebay', 'weight' => 9.7), 
    array('company' => 'ebay', 'weight' => 0.7), 
); 

$company = array(); 
$weight = array(); 

foreach($a as $key=>$val) { 
    array_push($company, $val['company']); 
    array_push($weight, $val['weight']); 
} 

array_multisort($weight, SORT_ASC, $a); 

print_r($a); 
1

で最初の例として使用されている

$arr = array(
    array('company' => 'A', 'weight' => 4.6), 
    array('company' => 'B', 'weight' => 1.7), 
    array('company' => 'C', 'weight' => 3.7), 
); 
usort($arr, function($a, $b) { return $b['weight'] > $a['weight'] ;}); 

print_r($arr); 

これが役に立ちます。

0

ここでは、またはそれ以上の作り付けのPHP関数

$multiarr = array('0'=>array(
     "hashtag" => "a7e87329b5eab8578f4f1098a152d6f4", 
     "title" => "Flower", 
     "order" => 3), 

'1' => array(
     'hashtag' => "b24ce0cd392a5b0b8dedc66c25213594", 
     "title" => "Free", 
     "order" => 2), 
'2' => array('hashtag' => 'e7d31fc0602fb2ede144d18cdffd816b', 
     'title' => 'Ready', 
     'order' => 1 
    )); 

を使用せずにソートマルチ次元配列をソート機能:

function multisort (&$array, $key) { 
$valsort=array(); 
$ret=array(); 
reset($array); 
foreach ($array as $ii => $va) { 
    $valsort[$ii]=$va[$key]; 
} 
asort($valsort); 
foreach ($valsort as $ii => $va) { 
    $ret[$ii]=$array[$ii]; 
} 
$array=$ret; 

}

マルチソート($ multiarrは、 "順序")は、ここでコード

入力します:出力:

Array 
(
[2] => Array 
    (
     [hashtag] => e7d31fc0602fb2ede144d18cdffd816b 
     [title] => Ready 
     [order] => 1 
    ) 

[1] => Array 
    (
     [hashtag] => b24ce0cd392a5b0b8dedc66c25213594 
     [title] => Free 
     [order] => 2 
    ) 

[0] => Array 
    (
     [hashtag] => a7e87329b5eab8578f4f1098a152d6f4 
     [title] => Flower 
     [order] => 3 
    )