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