zoukankan      html  css  js  c++  java
  • PHP 两个多维数组根据某个键的值进行组合排序的几种思路(二)

    几个经过封装的方法:

    1.使用 array_multisort() 函数

    <?php
    
    $arr = [
    	['name'=>'dee','age'=>28],
    	['name'=>'emperor', 'age'=>30],
    	['name'=>'Lee', 'age'=>32],
    	['name'=>'Arshavin', 'age'=>33],
    	['name'=>'Totti', 'age'=>40]
    ];
    
    $arr2 = [
    	['name'=>'Ozil', 'age'=>27],
    	['name'=>'CR7', 'age'=>29],
    	['name'=>'Doctor', 'age'=>33],
    	['name'=>'John', 'age'=>35]
    ];
    
    
    function multi_array_sort($multi_array, $sort_key, $sort = SORT_DESC) {
    	if (is_array($multi_array)) {
    		foreach ($multi_array as $row_array) {
    			if (is_array($row_array)) {
    				$key_array[] = $row_array[$sort_key];
    			} else {
    				return FALSE;
    			}
    		}
    	} else {
    		return FALSE;
    	}
    	array_multisort($key_array, $sort, $multi_array);
    	return $multi_array;
    }
    
    $arr = array_merge($arr, $arr2);
    $arr = multi_array_sort($arr, 'age', SORT_ASC);
    
    echo '<pre>';
    print_r($arr);
    

    说明:在 multi_array_sort 的自定义方法中,$key_array 完成对年龄的一维数组的排序,再使用 array_multisort() 函数对原数组进行排序。

    bool array_multisort ( array &$arr [, mixed $arg = SORT_ASC [, mixed $arg = SORT_REGULAR [, mixed $... ]]] )

    array_multisort() 可以用来一次对多个数组进行排序,或者根据某一维或多维对多维数组进行排序。输入数组被当成一个表的列并以行来排序——这类似于 SQL 的 ORDER BY 子句的功能。第一个数组是要排序的主要数组。数组中的行(值)比较为相同的话就按照下一个输入数组中相应值的大小来排序,依此类推。

    2. 使用临时数组存储需要排序的字段,经过排序后,通过在 froeach 循环中 $new_array[] = $arr[$k]; 把经过排序的字段数组的索引值作为原始数组的索引值存储至新的数组

    <?php
    
    $arr = [
    	['name'=>'dee','age'=>28],
    	['name'=>'emperor', 'age'=>30],
    	['name'=>'Lee', 'age'=>32],
    	['name'=>'Arshavin', 'age'=>33],
    	['name'=>'Totti', 'age'=>40]
    ];
    
    $arr2 = [
    	['name'=>'Ozil', 'age'=>27],
    	['name'=>'CR7', 'age'=>29],
    	['name'=>'Doctor', 'age'=>33],
    	['name'=>'John', 'age'=>35]
    ];
    
    
    function array_sort($arr, $keys, $type = 'asc') {
    	$keysvalue = $new_array = array();
    	foreach ($arr as $k => $v) {
    		$keysvalue[$k] = $v[$keys];
    	}
    
    	if ($type == 'asc') {
    		asort($keysvalue);
    	} else {
    		arsort($keysvalue);
    	}
    
    	reset($keysvalue);
    
    	foreach ($keysvalue as $k => $v) {
    		$new_array[] = $arr[$k];
    	}
    
    	return $new_array;
    }
    
    $arr = array_merge($arr, $arr2);
    $arr = array_sort($arr, 'age');
    
    echo '<pre>';
    print_r($arr);
    

      

    3. 和 2 差不多,多了些验证

    <?php
    
    $arr = [
    	['name'=>'dee','age'=>28],
    	['name'=>'emperor', 'age'=>30],
    	['name'=>'Lee', 'age'=>32],
    	['name'=>'Arshavin', 'age'=>33],
    	['name'=>'Totti', 'age'=>40]
    ];
    
    $arr2 = [
    	['name'=>'Ozil', 'age'=>27],
    	['name'=>'CR7', 'age'=>29],
    	['name'=>'Doctor', 'age'=>33],
    	['name'=>'John', 'age'=>35]
    ];
    
    
    function array_sort($array,$keys,$type='asc'){
    
    	if(!isset($array) || !is_array($array) || empty($array)){
    		return '';
    	}
    
    	if(!isset($keys) || trim($keys)==''){
    		return '';
    	}
    
    	if(!isset($type) || $type=='' || !in_array(strtolower($type),array('asc','desc'))){
    		return '';
    	}
    
    	$keysvalue=array();
    	foreach($array as $key=>$val){
    		$keysvalue[] =$val[$keys];
    	}
    
    	asort($keysvalue); //key值排序
    	reset($keysvalue); //指针重新指向数组第一个
    
    	foreach($keysvalue as $key=>$vals) {
    		$keysort[] = $key;
    	}
    
    	$keysvalue = array();
    	$count=count($keysort);
    
    	if(strtolower($type) != 'asc'){
    		for($i=$count-1; $i>=0; $i--) {
    			$keysvalue[] = $array[$keysort[$i]];
    		}
    	}else{
    		for($i=0; $i<$count; $i++){
    			$keysvalue[] = $array[$keysort[$i]];
    		}
    	}
    	return $keysvalue;
    }
    
    $arr = array_merge($arr, $arr2);
    $arr = array_sort($arr, 'age');
    
    echo '<pre>';
    print_r($arr);
    

      

    参考:php对多维数组的某个键值排序方法

  • 相关阅读:
    二分与三分
    NOIP应试技巧
    数论
    并差集
    最短路
    图的遍历

    最小生成树
    树状数组
    线段树
  • 原文地址:https://www.cnblogs.com/dee0912/p/5372537.html
Copyright © 2011-2022 走看看