Php 按十进制值对多维数组排序

Php 按十进制值对多维数组排序,php,sorting,multidimensional-array,floating-point,usort,Php,Sorting,Multidimensional Array,Floating Point,Usort,我要做的是对包含十进制值的多维数组进行排序。根据我的测试,浮点数在正确订购时遇到问题 Array ( [0] => Array ( [company] => Ebay [weight] => 4.6 ) [1] => Array ( [company] => Ebay [weight] => 1.7

我要做的是对包含十进制值的多维数组进行排序。根据我的测试,浮点数在正确订购时遇到问题

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'];
}

对这些数字进行降序排序的最佳方法是什么?

您可以使用数组\u 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);
echo”“;
$a=数组(
数组('company'=>'ebay','weight'=>4.6),
数组('company'=>'ebay','weight'=>1.7),
数组('company'=>'ebay','weight'=>3.7),
数组('company'=>'ebay','weight'=>2.7),
数组('company'=>'ebay','weight'=>9.7),
数组('company'=>'ebay','weight'=>0.7),
);
$company=array();
$weight=array();
foreach($a作为$key=>$val){
数组推送($company,$val['company']);
数组推送($weight,$val['weight']);
}
数组\u multisort($weight,SORT\u ASC,$a);
印刷费($a);

PS:这不是一门火箭科学-这个精确的“技巧”被用作第一个例子,在

你可以在一行中使用匿名函数

$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
    ));

希望这有帮助:)

因为排序算法这里是一个很好的例子,可以对多维数组进行排序,而无需使用任何内置php函数

    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;
排序功能:

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
    )
}

multisort($multiarr,“order”)在此处输入代码

:输出:

usort($data, function($a, $b) 
      {
        return ceil($a[$_GET['sortby']] - $b[$_GET['sortby']]); 
      });

)

如果有人想要更简洁的代码,特别是处理等于条件,您将在@zerkms的解决方案之前添加if条件

使用
ceil
将分数四舍五入,并将正确排序十进制数字


“浮动无法正确排序”-不,它们没有,你混淆了一些东西。@zerkms我可能误读了文档,但我没有误读顺序不正确的值。检查一下,php文档中说:“警告:从比较函数返回非整数值,如float,将导致回调返回值的内部转换为整数。因此,0.99和0.1等值都将转换为0的整数值,这将对这些值进行相等的比较。”我拿走了你的代码,它很有效:你试过运行它吗?@Zerkms你在浏览这篇文章,请在这里有建设性。“天哪,换成…”是不可接受的。请使用“答案”进行回复。完成后,有一个答案(将您的代码稍加修改)我喜欢它,比array_multisort短得多,并且易于阅读/使用@Benz:如果我们使用匿名函数的话,它可能会更短。这是真的,但我们不知道TS的PHP版本,我不确定,但我认为匿名函数的最小PHP版本是PHP5.4。@Benz:它是5.3,这在这些年非常流行days@Zerkms我知道这不是火箭科学,但有时在看了一个问题一段时间后,你会忽略一些简单的问题。谢谢你抽出时间回答我的问题。
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
    )
usort($data, function($a, $b) 
      {
        return ceil($a[$_GET['sortby']] - $b[$_GET['sortby']]); 
      });