天天看點

對二維數組進行二次排序的方法

很多時候,我們需要對一個二維關聯數組進行排序,而且這種排序可能不是一次就能排好,打個比方,一份成績單,首先按照分數倒序排序,在分數相同的情況下,按照學号進行順序排列;

代碼

<?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