2010-04-29 193 views
0

打印出我有包含這樣一些數據的數組:數據排序和按字母順序

$arrs = Array("ABC_efg", "@@zzAG", "@$abc", "ABC_abc") 

我是想打印出來的數據以這種方式(打印按字母順序排列):

[字符串開頭字符A]
ABC_abc
ABC_efg
[字符串開始於比A到Z其他字符]
@ $ ABC
@@ zzAG

+0

你需要你想要的確切排序規則非常明確。希望有人已經做出了正確的猜測。 – erisco 2010-04-29 09:25:49

回答

3

我打算假定你的意思是以字母開頭的字符串應該出現在所有其他字符串之前,並且所有字符串應該以標準順序排序。

您使用usort()併爲排序定義了一個自定義函數,並且爲ctype_alpha()定義了是否某個字母是否是字母。

$arrs = Array("ABC_efg", "@@zzAG", "@$abc", "ABC_abc"); 
usort($arrs, 'order_alpha_first'); 

function order_alpha_first($a, $b) { 
    $lenA = strlen($a); 
    $lenB = strlen($b); 
    $len = min($lenA, $lenB); 
    $i = 0; 
    while ($a[$i] == $b[$i] && $i < $len) { 
    $i++; 
    } 
    if ($i == $len) { 
    if ($lenA == $lenB) { 
     return 0; // they're the same 
    } else { 
     return $lenA < $lenB ? -1 : 1; 
    } 
    } else if (ctype_alpha($a[$i])) { 
    return ctype_alpha($b[$i]) ? strcmp($a[$i], $b[$i]) : -1; 
    } else { 
    return ctype_alpha($b[$i]) ? 1 : strcmp($a[$i], $b[$i]); 
    } 
} 

輸出:

Array 
(
    [0] => ABC_abc 
    [1] => ABC_efg 
    [2] => @$abc 
    [3] => @@zzAG 
) 
0

你寫一個函數sortArray($array, $preset=1)其將兩個數組的數組$。 (默認情況下,$預置爲空)

第一個數組包含所有以特殊符號開頭的元素,第二個數組包含所有以特殊符號開頭的元素。您比正常排序firstArray(sort())並打印它們,並調用第二個數組上的函數,傳遞預設。

(類似

if ($array[i][$preset] != "@") { 
array_push ($firstArray ,$array[i]); 
} else { 
array_push ($secondArray ,$array[i]); 
} 
sort($firstArray); 
print($firstArray); 
sortArray($secondArray, $preset++); 

這只是什麼來到我的腦海:)