2010-04-29 191 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++); 

这只是什么来到我的脑海:)