按特定索引降序对数组进行排序[重复]
Posted
技术标签:
【中文标题】按特定索引降序对数组进行排序[重复]【英文标题】:Sorting an array of arrays by specific index descending [duplicate] 【发布时间】:2018-05-26 16:12:29 【问题描述】:我有下面的数组
Array
(
[Prod1] => Array
(
[0] => $1,167,788.03
[1] => 26,872
[2] => 73.42
[3] => 19.0%
[4] => $1,134,106.83
[5] => $1,681,843.02
[6] => $3,098.65
[7] => $42.20
[8] => $-19.55
[9] => $-9.60
[10] => $43.46
[11] => 0.97
)
[Prod2] => Array
(
[0] => $6,730.84
[1] => 161
[2] => 0.44
[3] => 13.7%
[4] => $4,783.41
[5] => $6,755.61
[6] => $13.07
[7] => $29.71
[8] => $-27.30
[9] => $-21.50
[10] => $41.81
[11] => 0.71
)
[Prod3] => Array
(
[0] => $2,498,984.47
[1] => 30,409
[2] => 83.08
[3] => 21.5%
[4] => $3,026,866.16
[5] => $3,850,645.25
[6] => $8,270.13
[7] => $99.54
[8] => $-21.33
[9] => $-8.19
[10] => $82.18
[11] => 1.21
)
我正在尝试根据索引 [0] 按降序对其进行排序,并尝试使用不同的 php 内置函数,但我没有成功。
基本上,所需的结果将按以下顺序 Prod3、Prod1、Prod2。
解决这个问题的最佳方法是什么?
谢谢
【问题讨论】:
【参考方案1】:我不知道usort 是否是最好的方法,但用户功能相当简单:
usort($array, function ($a, $b)
$x = (int)str_replace(['$',',','.'],'',$a[0];
$y = (int)str_replace(['$',',','.'],'',$b[0];
if ($x === $y) return 0;
return ($x < $y) ? 1 : -1;
);
编辑:我第一次错过了值的格式。如果没有 Mohamad Attat 的回答,我不会找到它。如果您的美元金额总是有两位小数,则 str_replace 调用应该可以解决它。
【讨论】:
【参考方案2】:假设 $arr 是您在上面显示的数组,下面的代码应该适用于您的情况
$tmp_arr = array();
$sorted_arr = array();
foreach ($arr as $key => $val_array)
//removing $ and ,
$first_index_without_dollar = str_replace(array("$", ","), array("", ""), $val_array[0]);
//getting string as number in order to sort
$first_index_without_dollar = number_format((float) $first_index_without_dollar, 2, '.', '');
$tmp_arr[$first_index_without_dollar] = $key;
//sorting by key descending
krsort($tmp_arr);
foreach ($tmp_arr as $val)
$sorted_arr[$val] = $arr[$val];
【讨论】:
感谢您提供这么优雅的代码!以上是关于按特定索引降序对数组进行排序[重复]的主要内容,如果未能解决你的问题,请参考以下文章