array_multisort with natural sort

自闭症网瘾萝莉.ら 提交于 2019-12-17 19:02:41

问题


Is it possible to sort multiple dimensional array by multiple columns using natural sort in PHP? Here is an example. Suppose I have a 2D array of data, e.g.,

$array[1]['Name'] = 'John';
$array[1]['Age'] = '20';
$array[1]['Code'] = 'ABC 12';

$array[2]['Name'] = 'John';
$array[2]['Age'] = '21';
$array[2]['Code'] = 'ABC 1';

$array[3]['Name'] = 'Mary';
$array[3]['Age'] = '20';
$array[3]['Code'] = 'ABC 10';

I want to sort this array by name (ASC), then by age (DESC), and by code (ASC), all will be sorted naturally. Basically that will be array_multisort with natural sort.

I found many solutions about this topic on the web. Unfortunately, they only support sorting by one column, not multiple column.


回答1:


I think you have to implement a custom comparison function for this behavior:

function myCmp($a, $b) {
 $nameCmp = strnatcasecmp($a['Name'], $b['Name']);
 $ageCmp = strnatcasecmp($a['Age'], $b['Age']);
 $codeCmp = strnatcasecmp($a['Code'], $b['Code']);

 if ($nameCmp != 0) // Names are not equal
   return($nameCmp);

 // Names are equal, let's compare age

 if ($ageCmp != 0) // Age is not equal
   return($ageCmp * -1); // Invert it since you want DESC

 // Ages are equal, we don't need to compare code, just return the comparison result
   return($codeCmp);
}

Then you can call usort($array, 'myCmp'); and should get the desired sorting




回答2:


If you're using PHP 5.4 or newer, you can use array_multisort with the SORT_NATURAL flag.




回答3:


This code would do the trick:

// Your original data stored in $array
$array[1]['Name'] = 'John';
$array[1]['Age'] = '20';
$array[1]['Code'] = 'ABC 12';

$array[2]['Name'] = 'John';
$array[2]['Age'] = '21';
$array[2]['Code'] = 'ABC 1';

$array[3]['Name'] = 'Mary';
$array[3]['Age'] = '20';
$array[3]['Code'] = 'ABC 10';

// Since array_multisort() needs arrays of columns we need to 
// transform it and preserve he keys
foreach ($array as $key => $row) {
    $names[$key] = $row['Name'];
    $ages[$key] = $row['Age'];
    $codes[$key] = $row['Code'];
}

// Sort it according to your criterias
array_multisort($names, SORT_ASC, $ages, SORT_DESC, $codes, SORT_ASC, $array);

// $array now contains your sorted array.

Link to codepad: http://codepad.org/tr83Wt5J



来源:https://stackoverflow.com/questions/7839198/array-multisort-with-natural-sort

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!