是否可以使用PHP中的自然排序按多列对多维数组进行排序?这是一个例子。假设我有一个2D数据数组,例如,
$array[1]['Name'] = 'John';
$array[1]['Age'] = '20';
$array[1]['Code'] = 'ABC 12';
$array[2]['Name'] = 'John';
$array[2]['Age'] = '21';
$array[2]['Code'] = 'ABC 1';
$array[3]['Name'] = 'Mary';
$array[3]['Age'] = '20';
$array[3]['Code'] = 'ABC 10';
我想按名称(ASC)排序这个数组,然后按年龄(DESC)和代码(ASC)对所有数据进行自然排序。基本上这将是自然排序的array_multisort。
我在网上找到了很多关于这个主题的解决方案。不幸的是,它们只支持按一列排序,而不是多列。
答案 0 :(得分:6)
我认为您必须为此行为实现自定义比较功能:
function myCmp($a, $b) {
$nameCmp = strnatcasecmp($a['Name'], $b['Name']);
$ageCmp = strnatcasecmp($a['Age'], $b['Age']);
$codeCmp = strnatcasecmp($a['Code'], $b['Code']);
if ($nameCmp != 0) // Names are not equal
return($nameCmp);
// Names are equal, let's compare age
if ($ageCmp != 0) // Age is not equal
return($ageCmp * -1); // Invert it since you want DESC
// Ages are equal, we don't need to compare code, just return the comparison result
return($codeCmp);
}
然后你可以拨打usort($array, 'myCmp');
并获得所需的排序
答案 1 :(得分:1)
如果您使用的是PHP 5.4或更高版本,则可以将array_multisort
与SORT_NATURAL
标记一起使用。
答案 2 :(得分:0)
这段代码可以解决问题:
// Your original data stored in $array
$array[1]['Name'] = 'John';
$array[1]['Age'] = '20';
$array[1]['Code'] = 'ABC 12';
$array[2]['Name'] = 'John';
$array[2]['Age'] = '21';
$array[2]['Code'] = 'ABC 1';
$array[3]['Name'] = 'Mary';
$array[3]['Age'] = '20';
$array[3]['Code'] = 'ABC 10';
// Since array_multisort() needs arrays of columns we need to
// transform it and preserve he keys
foreach ($array as $key => $row) {
$names[$key] = $row['Name'];
$ages[$key] = $row['Age'];
$codes[$key] = $row['Code'];
}
// Sort it according to your criterias
array_multisort($names, SORT_ASC, $ages, SORT_DESC, $codes, SORT_ASC, $array);
// $array now contains your sorted array.
指向键盘的链接:http://codepad.org/tr83Wt5J