2011-10-20 79 views
5

是否有可能使用PHP中的自然排序多列排序多維數組?這是一個例子。假設我有數據的二維數組,例如,array_multisort與自然排序

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

我想按年齡(DESC)排序這個數組的名字(ASC),然後,通過代碼(ASC),一切都將自然排序。基本上這將是自然排序的array_multisort。

我在網上發現了很多關於這個主題的解決方案。不幸的是,他們只支持按一列排序,而不是多列。

回答

6

我認爲你必須實施此行爲的自定義比較函數:

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

然後你可以撥打usort($array, 'myCmp');並且應該得到所需的分類

+0

謝謝!!!!!!!!! –

+0

優秀!謝謝 – TeChn4K

0

該代碼會做的伎倆:

// 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. 

鏈接到鍵盤:http://codepad.org/tr83Wt5J

+0

謝謝,但這隻會做正常的排序,而不是自然排序。 –

+0

哦,傻了。即使您多次提及它,也會錯過自然排序的部分。 Klaustopher解決方案就像在這種情況下的魅力:) – Marcus

1

如果您使用PHP 5.4或更高版本,則可以使用array_multisortSORT_NATURAL標誌。