我正在使用 PHP 进行编码并拥有一个多维数组。我想对我的数组进行排序。最重要的标准是总分。第二个标准是名字。
换句话说,数组应该这样排序:
第 1 位,按 [信息][总计] 排列,降序
第 2 位,按 [信息][名称] 升序排列
Array (
[183] => Array (
[3] => Array (
[1] => Array ()
)
[1] => Array (
[8] => Array ()
)
[info] => Array (
[name] => Doe John /* 2nd criteria */
[total] => 4800 /* 1st criteria */
)
)
[380] => Array (
[4] => Array (
[6] => Array ()
)
[info] => Array (
[name] => Davis Ben /* 2nd criteria */
[total] => 14500 /* 1st criteria */
)
[2] => Array (
[5] => Array ()
)
)
)
所以,结果应该是这样的:
Array (
[380] => Array (
[4] => Array (
[6] => Array ()
)
[info] => Array (
[name] => Davis Ben
[total] => 14500
)
[2] => Array (
[5] => Array ()
)
)
[183] => Array (
[3] => Array (
[1] => Array ()
)
[1] => Array (
[8] => Array ()
)
[info] => Array (
[name] => Doe John
[total] => 4800
)
)
)
我试过这个:
foreach ($array as &$item)
{
uasort($item, function ($a, $b)
{
if ($a['total'] == $b['total']
{
return $b['name'] - $a['name'];
}
else
{
return $b['total'] - $a['total'];
}
});
}
我也尝试过这个,但没有帮助:
foreach ($array as &$item)
{
uasort($item, function ($a, $b)
{
if ($a['info']['total'] == $b['info']['total'])
{
return $b['info']['name'] - $a['info']['name'];
}
else
{
return $b['info']['total'] - $a['info']['total'];
}
});
}
您的问题的要求(按自定义标准对值进行排序,保持键和值之间的关联)完全符合PHP函数的描述
uasort()
。
代码是这样的:
$input = Array(
'183' => Array(
'3' => Array(
'1' => Array(),
),
'1' => Array(
'8' => Array(),
),
'info' => Array(
'name' => 'Doe John', /* 2nd criteria */
'total' => 4800, /* 1st criteria */
),
),
'380' => Array(
'4' => Array(
'6' => Array(),
),
'info' => Array(
'name' => 'Davis Ben', /* 2nd criteria */
'total' => 14500, /* 1st criteria */
),
'2' => Array(
'5' => Array(),
),
),
);
uasort($input, function (array $a, array $b) {
// compare using the 1st criterion
if ($a['info']['total'] != $b['info']['total']) {
return $b['info']['total'] - $a['info']['total']; // < 0 when $a > $b (descending)
}
// equality on the 1st criterion, use the 2nd one
return strcmp($a['info']['name'], $b['info']['name']); // < 0 when $a < $b (ascending)
});
您可以通过构建两组数组进行比较来指定两种排序规则。对于 DESC 排序,将
$b
值写在比较运算符的左侧;对于 ASC 排序,请在比较运算符的左侧写入 $a
。
两个数组中的元素将以从左到右的方式进行比较。
代码:(演示)
uasort(
$array,
fn($a, $b) => [$b['info']['total'], $a['info']['name']] // total DESC, name ASC
<=>
[$a['info']['total'], $b['info']['name']]
);
var_export($array);