很多時候,我們需要對一個二維關聯數組進行排序,而且這種排序可能不是一次就能排好,打個比方,一份成績單,首先按照分數倒序排序,在分數相同的情況下,按照學号進行順序排列;
代碼
<?php
uasort($arr, 'my_sort');
function my_sort($a, $b) {
// 全局化排序鍵
global $firstKey, $secondKey;
// 如果第一排序鍵對應的值相同
if (intval($a[$firstKey]) == intval($b[$firstKey])) {
// 則按第二排序鍵進行順序排列
return (intval($a[$secondKey]) > intval($b[$secondKey])) ? 1 : -1;
} else {
// 否則按第一排序鍵進行倒序排列
return (intval($a[$firstKey]) > intval($b[$firstKey])) ? -1 : 1;
}
}
?>
測試
$arr = array(
array(
'name'=>'悔創阿裡傑克馬',
'score'=>'96',
'number'=>'02',
),
array(
'name'=>'普通家庭馬化騰,',
'score'=>'96',
'number'=>'01',
),
array(
'name'=>'不知妻美劉強東',
'score'=>'96',
'number'=>'03',
),
array(
'name'=>'一無所有王健林',
'score'=>'90',
'number'=>'05',
),
array(
'name'=>'随便掙錢丁三石',
'score'=>'90',
'number'=>'34',
),
array(
'name'=>'名下無房潘石屹',
'score'=>'100',
'number'=>'11',
),
array(
'name'=>'下周回國賈躍亭',
'score'=>'80',
'number'=>'06',
),
);
// 第一排序鍵
$firstKey = 'score';
// 第二排序鍵
$secondKey = 'number';
uasort($arr, 'my_sort');
var_dump($arr);
結果
/opt/wwwroot/test/test3.php:65:
array (size=7)
5 =>
array (size=3)
'name' => string '名下無房潘石屹' (length=21)
'score' => string '100' (length=3)
'number' => string '11' (length=2)
1 =>
array (size=3)
'name' => string '普通家庭馬化騰,' (length=24)
'score' => string '96' (length=2)
'number' => string '01' (length=2)
0 =>
array (size=3)
'name' => string '悔創阿裡傑克馬' (length=21)
'score' => string '96' (length=2)
'number' => string '02' (length=2)
2 =>
array (size=3)
'name' => string '不知妻美劉強東' (length=21)
'score' => string '96' (length=2)
'number' => string '03' (length=2)
3 =>
array (size=3)
'name' => string '一無所有王健林' (length=21)
'score' => string '90' (length=2)
'number' => string '05' (length=2)
4 =>
array (size=3)
'name' => string '随便掙錢丁三石' (length=21)
'score' => string '90' (length=2)
'number' => string '34' (length=2)
6 =>
array (size=3)
'name' => string '下周回國賈躍亭' (length=21)
'score' => string '80' (length=2)
'number' => string '06' (length=2)
總結
1, 對已有方法的運用掌握還不夠,總想着自己造輪子,需要再強化;
2, 這個方法還的封裝性還不夠好,不能使用匿名函數;
自己寫的複雜未完結待修改版本
/*
* 二維數組排序
* $arr 需要處理的二維數組
* $row 需要排序的列
* $type 倒序還是升序
* 一次排序保留鍵值對對應關系,二次排序不保留鍵值對應關系
*/
function array_sort($arr, $firstRow, $secondRow, $type='asc') {
$firstRowResult = array();
$secondRowResult = array();
// 先按第一排序鍵排列好
if (!empty($arr)) {
foreach ($arr as $key=>$value) {
// 在二維數組的所有元素中第一排序鍵對應的所有值
$firstRowArray[$key] = $value[$firstRow];
}
if ($type == 'asc') {
asort($firstRowArray);
} else {
arsort($firstRowArray);
}
reset($firstRowArray);
foreach ($firstRowArray as $k=>$v) {
$firstRowResult[$k] = $arr[$k];
}
}
// 再進行第二排序鍵的排列
// 如果第一排序鍵對應了相同的值,則按第二排序鍵進行排序
// 在第一排序鍵相同值數組中,用第二排序鍵的順序來決定二維數組的鍵的排序
// 如何取出第一排序鍵相同值的數組
if ($secondRow == '') {
return $firstRowResult;
} else {
print 11111111;
var_dump($firstRowResult);
$firstRowArray = array();
// 取出所有值,不保留鍵值對關系
// $firstRowResult = array_values($firstRowResult);
foreach ($firstRowResult as $key=>$value) {
// 在二維數組的所有元素中第一排序鍵對應的所有值
$firstRowArray[$key] = $value[$firstRow];
}
var_dump($firstRowArray);
foreach ($firstRowArray as $firstRowKey=>$firstRowValue) {
// 第一排序鍵的值出現的所有鍵
$firstRowSameValueKeys = array_keys($firstRowArray, $firstRowValue);
var_dump($firstRowSameValueKeys);
// 第一排序鍵的值出現的次數
$len = count($firstRowSameValueKeys);
// 如果第一排序鍵的值隻出現過一次
if ($len == 1) {
print '跳過1';
$secondRowResult[] = $firstRowValue;
continue;
// 如果出現過多次,則有重複值
} else {
// 重複值的鍵都是挨在一起的
// 在重複值内部按第二排序鍵進行排序
$secondRowArray = array();
// 對所有擁有相同值的第一鍵進行周遊
foreach ($firstRowSameValueKeys as $firstRowSameValueKey) {
// 取出二維數組中第一鍵的值相同的所有元素
$secondRowArray[$firstRowSameValueKey] = $firstRowResult[$firstRowSameValueKey];
}
var_dump($secondRowArray);
// 将第一鍵的值相同的所有元素組成的數組按第二鍵進行排序,傳回排序後的第一鍵的值相同的所有元素組成的數組
$secondRowArray = array_sort($secondRowArray, $secondRow, '', $type);
var_dump($secondRowArray);
$secondRowResult = array_merge($secondRowResult, $secondRowArray);
var_dump($secondRowResult);
}
}
return $secondRowResult;
}
}
$result = array_values($result);
版權聲明:本文為CSDN部落客「weixin_33790053」的原創文章,遵循CC 4.0 BY-SA版權協定,轉載請附上原文出處連結及本聲明。
原文連結:https://blog.csdn.net/weixin_33790053/article/details/92387318