2013-04-11 3 views
6

То, что я пытаюсь сделать, это сортировать многомерный массив, содержащий десятичные значения. Из того, что я тестировал, поплавки испытывают трудности при правильном порядке.Сортировка Многомерный массив по десятичным значениям

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. Проверьте это, что указано в 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: это не ракетостроение - это точно «трюк» используется в качестве первого примера на http://php.net/usort

+0

Мне это нравится, намного короче, чем array_multisort, и просто читать/использовать! – Benz

+0

@Benz: он может быть даже короче, если мы использовали анонимные функции – zerkms

+0

Полностью верно, но мы не знаем версию PHP PHP, я не уверен, но я думал, что минимальная версия PHP для анонимных функций - это PHP 5.4 , – Benz

0

Вы можете отсортировать массив с помощью array_multisort, хотя это часто используется для сортировки по нескольким значениям массива вместо одного.

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

Как сортировать algo вот хороший пример f или сортировками несколько одномерного массива без использования каких-либо более встроенных функций 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; 

}

Multisort ($ 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 
    ) 

)

Смежные вопросы