多維陣列排序

junwind發表於2021-09-03

示例陣列

$arr = [
    ['key1'=> 940, 'key2'=>'blah'],
    ['key1'=>23, 'key2'=>'this'],
    ['key1'=>894, 'key2'=>'that']
];

自定義排序函式

  • 接收兩個引數
  • 返回值表示哪個引數應該在前
  • 返回負數或false,則第一個在前 (注意正序,倒序)
  • 返回正數或true,則第二個在前
  • 返回0,則相等

呼叫函式

  • usort() 按值排序,不保留鍵
  • uasort() 按值排序,保留鍵
  • uksort() 按鍵排序

根據key1排序,數值

function asc_number_sort($x, $y) {
  if ($x['key1'] > $y['key1']) {//第一個大於第二個,返回true,則第二個在前,可見是正序排序,如果反過來則是倒序
  return true;
  } elseif ($x['key1'] < $y['key1']) {
  return false;
  } else {
  return 0;
  }
}
usort($arr, 'asc_number_sort');

根據key2排序,字串

function string_sort($x, $y) {
    return strcasecmp($x['key2'], $y['key2']);//strcmp()區分大小寫
}
usort($arr, 'string_sort');

在看一個例子

$students = [
  256 => ['name'=>'Jon', 'grade'=>98.5],
  2 => ['name'=>'Vance', 'grade' =>85.1],
  9 => ['name'=>'Stephen', 'grade'=>94.0],
  364 => ['name'=>'Steve', 'grade'=>85.1],
  68 => ['name'=>'Rob', 'grade'=>74.6]
];
function name_sort($x, $y) {
  return strcasecmp($x['name'], $y['name']);//strcasecmp()返回一個數值,如果是負數,則第一個在前,如果是正數,則第二個在前,如果0,則相等
}
function grade_sort($x, $y) {
  return $x['grade'] < $y['grade'];//小於返回true,則第二個在前,倒序
}
uasort($students, 'name_sort');//保留學生id
本作品採用《CC 協議》,轉載必須註明作者和本文連結
六月的風

相關文章