Home  >  Article  >  Backend Development  >  Example of specifying multi-field sorting for PHP multidimensional arrays

Example of specifying multi-field sorting for PHP multidimensional arrays

不言
不言Original
2018-06-01 10:08:392096browse

This article mainly introduces examples of specifying multi-field sorting for PHP multi-dimensional arrays. It has a certain reference value. Now I share it with you. Friends in need can refer to it.

Introducing the array_multisort method

array_multisort — Sort multiple arrays or multidimensional arrays. The instructions in the PHP manual are as follows:

Copy code The code is as follows:

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

Parameters

arr
An array to be sorted.

#arg
Each of the following parameters can be another array or a sorting flag option parameter for the previous array: SORT_ASC, SORT_DESC, SORT_REGULAR, SORT_NUMERIC, SORT_STRING.

Additional arg's.

First implement the sorting of one field of the specified multi-dimensional array

Here it is required to sort the array according to one of the fields. The array assumptions are as follows:

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

We need to sort according to the id value of the two-dimensional array. The converted array format is as follows:

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

To complete the above conversion, you need to use the array_multisort function introduced above, as follows:

  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);
  }

By The $field of each array in the sorted array is stored in a one-bit array fieldArr and participates in sorting in the incoming array_multisort. The value of the field array is as follows:

array(0=>8,1=>9,2=>5)

After passing in array_multisort, it is equivalent to sorting the $field one-dimensional array, and then rebuilding it based on the sorted key The incoming array to be sorted.

Implementing sorting of multi-dimensional arrays by specifying multiple fields

The above example explains how to implement sorting of multi-dimensional arrays by specifying one field, but if you want How to think about specifying multiple fields to sort an array?
How many fields are there? 2, 3 or more, so this uncertain factor needs to be eliminated.

Let’s first look at the 2 solutions for specifying 2 fields for sorting:

  $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))

Refactor the above code, just use php The func_get_args function in can dynamically obtain the incoming value, which can solve the problem of uncertain number of multiple fields. The implementation is as follows:

  $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);

The running result is as follows:

    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)
      }
    }

The above is the entire content of this article, thank you for reading. Please pay attention to the PHP Chinese website for more information!

Related recommendations:

php strftime function to obtain date and time (switch usage)

PHP multi-task second-level timer Implementation method

The above is the detailed content of Example of specifying multi-field sorting for PHP multidimensional arrays. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn