php 数组排序(其中的一个值进行排序)(array_multisort实现多维数组按多个值排序问题)

方法一:

php 数组排序

 

$arr = array("b", "a", "c");
sort($arr);
print_r($arr);


错误写法:

 

$arr=sort($arr);

正确写法:

sort($arr);

 

在php中自带了大量了数组排序函数,下面我们一一来介绍一下关于php数组排序的用法吧。
  sort() 函数用于对数组单元从低到高进行排序。
  rsort() 函数用于对数组单元从高到低进行排序。
  asort() 函数用于对数组单元从低到高进行排序并保持索引关系。
  arsort() 函数用于对数组单元从高到低进行排序并保持索引关系。
  ksort() 函数用于对数组单元按照键名从低到高进行排序。
  krsort() 函数用于对数组单元按照键名从高到低进行排序。
  sort()
  PHP sort() 函数用于对数组单元从低到高进行排序,如果成功则返回 TRUE,失败则返回 FALSE。
  注意:本函数会为排序的数组中的单元赋予新的键名,这将删除原有的键名而不仅是重新排序。
  语法:
  bool sort( array &array [, int sort_flags] )
  可选参数 sort_flags 用于改变排序的行为:
  sort_flags 取值 说明
  SORT_REGULAR 正常比较单元
  SORT_NUMERIC 单元被作为数字来比较
  SORT_STRING 单元被作为字符串来比较
  SORT_LOCALE_STRING 根据当前的区域(locale)设置来把单元当作字符串比较

 

例子二:

$cmf_settings = array(
            array (
                "url" => "img/20191015/5da586020fa6b.jpg",
                "alt" => "lunbo2",
                "href" => "https://www.baidu.com/",
                "sort" => "7"
            ),
            array(
                "url" => "img/20191018/5da9783499dec.jpg",
                "alt" => "X1300",
                "href" => "https://www.baidu.com/fully-automatic-pallet-wrappin/x1300-180.html",
                "sort" => "3"
            ),
            array(
                "url" => "img/20191018/5da987c81f420.jpg",
                "alt" => "S300",
                "href" => "https://www.baidu.com/fully-automatic-pallet-wrappin/s300-170.html",
                "sort" => "4"
            )
        );
$cmf_arr = array_column($cmf_settings, 'sort');
array_multisort($cmf_arr, SORT_ASC, $cmf_settings);

SORT_ASC - 默认。按升序排列 (A-Z)。
SORT_DESC - 按降序排列 (Z-A)。

 

输出结果:

php 数组排序(其中的一个值进行排序)(array_multisort实现多维数组按多个值排序问题)_第1张图片

参考:https://www.cnblogs.com/lzijiangg/p/11731298.html

 

方法二:首先来看看array_multisort这个数组操作方法的文档:

php 数组排序(其中的一个值进行排序)(array_multisort实现多维数组按多个值排序问题)_第2张图片

1.先实现指定多维数组一个字段排序
此处要求根据其中的一个字段来对数组进行排序,数组假设如下:

$array = array(
    0=>array('id'=>8,'name'=>'Tom'),
    1=>array('id'=>9,'name'=>'Peter'),
    2=>array('id'=>5,'name'=>'Jack')
);


我们要根据二维数组的id值来排序,转换后的数组格式如下:

$array = array(
    0=>array('id'=>5,'name'=>'Jack')
    1=>array('id'=>8,'name'=>'Tom'),
    2=>array('id'=>9,'name'=>'Peter')
);


实现:通过将待排序数组的各个数组的$field保存在一位数组fieldArr中,在传入array_multisort中参与排序。其中field数组的值如下:

array(0=>8,1=>9,2=>5)
function sortArrByOneField(&$array, $field, $desc = false){
  $fieldArr = array();
  foreach ($array as $k => $v) {
   $fieldArr[$k] = $v[$field];
  }
  $sort = $desc == false ? SORT_ASC : SORT_DESC;
  array_multisort($fieldArr, $sort, $array);
}

传入 array_multisort后,相当于对$field一维数组的排序,而后根据排序后的key重新构建传入的待排序数组。
 

2.实现多维数组的指定两个字段排序

$arr = array(
  '0' => array(
    'id' => 3,
    'age' => 27
  ),
  '1' => array(
    'id' => 5,
    'age' => 50
  ),
  '2' => array(
    'id' => 4,
    'age' => 44
  ),
  '3' => array(
    'id' => 3,
    'age' => 78
  ) 
);
foreach ( $arr as $key => $row ){
  $id[$key] = $row ['id'];
  $age[$key] = $row ['age'];
}
array_multisort($id, SORT_ASC, $age, SORT_DESC, $arr);
print_r($arr);
//result:Array([0]=>Array(['id']=>3 ['age']=>78) [1]=>Array(['id']=>3 ['age']=>27) [2]=>Array(['id']=>4 ['age']=>44) [3]=>Array(['id']=>5 ['age']=>50))

3.实现多维数组的指定多个字段排序

重构上述代码,只要采用php中的func_get_args函数,来动态获取传入的值,既可以解决多字段个数不确定的问题。实现如下:

$array1 = array(
      0=>array('id'=>8,'name'=>'Apple','age'=> 18),
      1=>array('id'=>8,'name'=>'Bed','age'=>17),
      2=>array('id'=>5,'name'=>'Cos','age'=>16),
      3=>array('id'=>5,'name'=>'Cos','age'=>14)
);
function sortArrByManyField(){
  $args = func_get_args();
  if(empty($args)){
    return null;
  }
  $arr = array_shift($args);
  if(!is_array($arr)){
    throw new Exception("第一个参数不为数组");
  }
  foreach($args as $key => $field){
    if(is_string($field)){
      $temp = array();
      foreach($arr as $index=> $val){
        $temp[$index] = $val[$field];
      }
      $args[$key] = $temp;
    }
  }
  $args[] = &$arr;//引用值
  call_user_func_array('array_multisort',$args);
  return array_pop($args);
}
$arr = sortArrByManyField($array1,'id',SORT_ASC,'name',SORT_ASC,'age',SORT_DESC);
print_r($arr);

结果如下:

array(4) {
      [0]=>array(3) {
            ["id"]=>int(5)
            ["name"]=>string(3) "Cos"
            ["age"]=>int(16)
          }
      [1]=>array(3) {
            ["id"]=>int(5)
            ["name"]=>string(3) "Cos"
            ["age"]=>int(14)
          }
      [2]=>array(3) {
            ["id"]=>int(8)
            ["name"]=>string(5) "Apple"
            ["age"]=>int(18)
          }
      [3]=>array(3) {
            ["id"]=>int(8)
            ["name"]=>string(3) "Bed"
            ["age"]=>int(17)
      }
    }

引用:https://blog.csdn.net/qq_33980878/article/details/84030679

 

 

 

 

 

你可能感兴趣的:(php)