在2列上排序2d数组

时间:2018-06-20 11:11:27

标签: php

我正在尝试对数组进行排序:

2018 - zaza - ZAZA - IJ - bl
2016 - hehe - HEHe - BR - no
2004 - dons - Dons - GF - fd
2001 - gees - GEEs - vc - ye
2018 - hhww - HhWw - aa - qi
2018 - ahww - ahWw - xa - wi

应首先在第1列上对其进行排序,然后在第2列上进行排序,如下所示:

2018 - ahww - ahWw - xa - wi
2018 - hhww - HhWw - aa - qi
2018 - zaza - ZAZA - IJ - bl
2016 - hehe - HEHe - BR - no
2004 - dons - Dons - GF - fd
2001 - gees - GEEs - vc - ye

这是一个包含5000行以上的数组,因此应尽可能快。 我试图使用array_multisort,但是我被卡住了。有什么建议吗?

2 个答案:

答案 0 :(得分:0)

您可以在此处使用array_multisort的有效代码:


     function array_column2(array $input, $columnKey=null, $indexKey = null) {
        $array = array();
        foreach ($input as $value) {
            if ( !array_key_exists($columnKey, $value)) {
                trigger_error("Key $columnKey does not exist in array");
                return false;
            }
            if (is_null($indexKey)) {
                $array[] = $value[$columnKey];
            }
            else {
                if ( !array_key_exists($indexKey, $value)) {
                    trigger_error("Key ".$indexKey." does not exist in array");
                    return false;
                }
                if ( ! is_scalar($value[$indexKey])) {
                    trigger_error("Key ".$indexKey." does not contain scalar value");
                    return false;
                }
                $array[$value[$indexKey]] = $value[$columnKey];
            }
        }
        return $array;
    }
      $arr=array();

    $arr[0]=array('2018','zaza','ZAZA','IJ','bl');
    $arr[1]=array('2016','hehe','HEHe','BR','no');
    $arr[2]=array('2004','dons','Dons','GF','fd');
    $arr[3]=array('2001','gees','GEEs','vc','ye');
    $arr[4]=array('2018','hhww','HhWw','aa','qi');
    $arr[5]=array('2018','ahww','ahWw','xa','wi');

                    array_multisort(array_column2($arr, '0'),  SORT_DESC, array_column2($arr, '1'), 
   SORT_ASC,$arr);


foreach($arr as $key)
{
    print implode('-',$key);

}

答案 1 :(得分:0)

在这种情况下,我建议您使用usort或uasort来构建自己的比较功能和按该功能排序。

$raw_data = 
"2018 - zaza - ZAZA - IJ - bl
 2016 - hehe - HEHe - BR - no
 2004 - dons - Dons - GF - fd
 2001 - gees - GEEs - vc - ye
 2018 - hhww - HhWw - aa - qi
 2018 - ahww - ahWw - xa - wi ";

// explodes a single string row
$explode_row = function($row) {
  return explode(' - ', $row);
};

// parse the raw data into an array of arrays
$data = array_map($explode_row, explode(PHP_EOL, $raw_data));

// given two integer field indexes creates a function
// that can compare two rows by first field first
$compare_function_maker = function($f1, $f2) {
  // compare string or integer values
  $compare_values = function($a, $b) {
    if (is_string($a)) {
      return strcasecmp($a, $b);
    }
    return $a - $b;
  };

  // returns a comparison function
  return function($a, $b) use($f1, $f2, $compare_values) {
    $fs_compare = $compare_values($a[$f1], $b[$f1]);
    if ($fs_compare == 0) {
      return $compare_values($a[$f2], $b[$f2]);
    }
    return $fs_compare;
  };
};

// returns a printable table
$to_string = function($table) {
  $implode_row = function($row) {
    return implode(' - ', $row);
  };
  return implode('<br/>', array_map($implode_row, $table));
};
// sort by year (field 0) and the second string (field 2)
usort($data, $compare_function_maker(0, 2));
print($to_string($data));

此输出

2001 - gees - GEEs - vc - ye
2004 - dons - Dons - GF - fd
2016 - hehe - HEHe - BR - no
2018 - ahww - ahWw - xa - wi
2018 - hhww - HhWw - aa - qi
2018 - zaza - ZAZA - IJ - bl