usort 对多个字段进行排序
Posted
技术标签:
【中文标题】usort 对多个字段进行排序【英文标题】:usort sorting multiple fields 【发布时间】:2012-03-04 20:15:57 【问题描述】:是否可以使用usort
对多维数组中的多个字段进行排序?例如,我想按字母顺序对name
进行排序,然后从这些记录中按age
对它们进行排序。这可以使用sort
吗?
Array (
[0] => Array (
[name] => Jonah
[age] => 27
)
[1] => Array (
[name] => Bianca
[age] => 32
)
)
【问题讨论】:
Sort multidimensional array by multiple keys的可能重复 【参考方案1】:怎么样:
<?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);
【讨论】:
这个解决方案是我经过多次研究发现的最好的!它独立于您想要的排序参数数量以及升序或降序。 这绝对是最好、最通用的解决方案!【参考方案2】:usort($arr, function($a, $b)
$name = strcmp($a['name'], $b['name']);
if($name === 0)
return $a['age'] - $b['age'];
return $name;
);
【讨论】:
出于好奇,如果我对name
进行排序,但它是一个整数(例如),而不是使用strcmp
,你会推荐使用什么函数?
@user1205775:只要使用简单的算术运算符就可以了。【参考方案3】:
怎么样:
$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);
输出:
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
)
)
【讨论】:
嗨,如果要描述年龄?是return $a['age'] + $b['age'];
吗?
@SweeHong:使用:return $b['age'] - $a['age'];
如果年龄是一个字符串,你可以做 strcmp($a['age'], $b['age']);以上是关于usort 对多个字段进行排序的主要内容,如果未能解决你的问题,请参考以下文章
Grails 映射对多个字段进行排序 :: Groovy 对多个映射条目进行排序