我想对数组值进行分组并找到总计(基于值的数组值之和),然后根据总计对数组进行排序。我想按资金类型(“私募,创投,其他”)和资金总额(“最终值”)按用户分组
我在这里建立了一个演示链接。
<?php
$data = [
[
'Jon',
'NO',
"",
"Private",
120
],
[
'Andew',
'NO',
"",
"VC",
150
],
[
'Walid',
'YES',
"",
"Other",
160
],
[
'Andew',
'YES',
"",
"VC",
150
],
[
'Andew',
'YES',
"",
"VC",
180
],
[
'Jon',
'NO',
"",
"Other",
150
],
[
'Andew',
'YES',
"",
"Other",
600
]
];
$arr = array();
foreach ($data as $key => $item) {
$arr[$item[0]][$key] = $item['4'];
}
var_dump($arr);
我想要下面的输出
分组依据(“私有,VC,其他”),所以值格式如[私有的总和,VC的总和,其他的总和]
Array
(
[Jon] => [120,110,0]
[Andew] => [0,480,600]
[Walid] => [0,0,160]
)
然后我想基于总和对数组进行排序
Array
(
[Andew] => [0,480,600]
[Jon] => [120,110,0]
[Walid] => [0,0,160]
)
任何人请提出可能解决此问题的解决方案?
谢谢
如果这是数据库查询的结果,则可以肯定可以在该查询中更有效地完成此操作。但是,您可以分3个阶段获得所需的结果:
$arr = array();
foreach ($data as $key => $item) {
$arr[$item[0]][$item[3]] = ($arr[$item[0]][$item[3]] ?? 0) + $item[4];
}
foreach (array_unique(array_column($data, 3)) as $type) {
foreach ($arr as &$person) {
if (!isset($person[$type])) $person[$type] = 0;
}
}
uasort($arr, function ($a, $b) {
return $b['Private'] + $b['Other'] + $b['VC'] - ($a['Private'] + $a['Other'] + $a['VC']);
});
输出(用于样本数据):
Array
(
[Andew] => Array
(
[VC] => 480
[Other] => 600
[Private] => 0
)
[Jon] => Array
(
[Private] => 120
[Other] => 150
[VC] => 0
)
[Walid] => Array
(
[Other] => 160
[Private] => 0
[VC] => 0
)
)
请注意,我将内部数组的键保留为关联的,因为这似乎更有用。如果您希望使用数字键,则需要对每个内部数组进行排序,以使键以相同的顺序排列,然后取array_values
每个条目:
$key_rank = array('Private' => 0, 'VC' => 1, 'Other' => 2);
foreach ($arr as &$person) {
uksort($person, function ($a, $b) use ($key_rank) {
return $key_rank[$a] - $key_rank[$b];
});
$person = array_values($person);
}
输出:
Array
(
[Andew] => Array
(
[0] => 0
[1] => 480
[2] => 600
)
[Jon] => Array
(
[0] => 120
[1] => 0
[2] => 150
)
[Walid] => Array
(
[0] => 0
[1] => 0
[2] => 160
)
)
要以包含名称和值的数组形式获取结果,请使用以下代码替换最后一段代码:
$key_rank = array('Private' => 0, 'VC' => 1, 'Other' => 2);
$result = array();
foreach ($arr as $name => &$person) {
uksort($person, function ($a, $b) use ($key_rank) {
return $key_rank[$a] - $key_rank[$b];
});
$result[] = array_merge(array($name), array_values($person));
}
print_r($result);
输出:
Array
(
[0] => Array
(
[0] => Andew
[1] => 0
[2] => 480
[3] => 600
)
[1] => Array
(
[0] => Jon
[1] => 120
[2] => 0
[3] => 150
)
[2] => Array
(
[0] => Walid
[1] => 0
[2] => 0
[3] => 160
)
)
[Demo on 3v4l.org][3]
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句