我正在尝试对数组进行排序:
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,但是我被卡住了。有什么建议吗?
答案 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