php 对多个字段进行排序
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/9260343/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-26 06:26:49 来源:igfitidea点击:
usort sorting multiple fields
提问by user1205775
Is it possible to use usort
to sort multiple fields in a multidimensional array? For example, I want to sort name
alphabetically and then from those records I want to sort them by age
. Is this possible using sort
?
是否可以使用usort
对多维数组中的多个字段进行排序?例如,我想name
按字母顺序排序,然后从这些记录中按age
. 这可以使用sort
吗?
Array (
[0] => Array (
[name] => Jonah
[age] => 27
)
[1] => Array (
[name] => Bianca
[age] => 32
)
)
回答by Toto
How about:
怎么样:
$arr = Array (
0 => Array (
'name' => 'Jonah',
'age' => '27',
),
1 => Array (
'name' => 'Bianca',
'age' => '32',
),
2 => Array (
'name' => 'Jonah',
'age' => '25',
),
3 => Array (
'name' => 'Bianca',
'age' => '35',
),
);
function comp($a, $b) {
if ($a['name'] == $b['name']) {
return $a['age'] - $b['age'];
}
return strcmp($a['name'], $b['name']);
}
usort($arr, 'comp');
print_r($arr);
output:
输出:
Array
(
[0] => Array
(
[name] => Bianca
[age] => 32
)
[1] => Array
(
[name] => Bianca
[age] => 35
)
[2] => Array
(
[name] => Jonah
[age] => 25
)
[3] => Array
(
[name] => Jonah
[age] => 27
)
)
回答by Tim Cooper
usort($arr, function($a, $b)
{
$name = strcmp($a['name'], $b['name']);
if($name === 0)
{
return $a['age'] - $b['age'];
}
return $name;
});
回答by Guy Fawkes
How about:
怎么样:
<?php
function getRandomName() {
$possible = "ab";
$possible_len = strlen($possible);
$r = '';
for ($i = 0; $i < 4; $i++) {
$r .= substr($possible, mt_rand(0, $possible_len-1), 1);
}
return ucfirst($r);
}
$a = array();
for ($i = 0; $i < 10; $i++) {
$a[] = array('name' => getRandomName(), 'age' => rand(1,10), 'start_order' => $i);
}
$order = array('name' => 'desc', 'age' => 'asc');
print_r($a);
usort($a, function ($a, $b) use ($order) {
$t = array(true => -1, false => 1);
$r = true;
$k = 1;
foreach ($order as $key => $value) {
$k = ($value === 'asc') ? 1 : -1;
$r = ($a[$key] < $b[$key]);
if ($a[$key] !== $b[$key]) {
return $t[$r] * $k;
}
}
return $t[$r] * $k;
});
print_r($a);