2014-11-14 41 views
3

我有一个数组修改PHP natcasesort所以“只能是字母”放在第一位

$arr=array(
"Mega XYZ no number", 
"Classic no Number", 
"Doppel 80x200cm", 
"Classic 100x200cm", 
"Mega 240x250", 
"Classic 85x200cm", 
"Mega 40x250", 
"Profi 60x235cm", 
"Mega 140x250", 
); 

,并想有以下顺序:

Classic no Number 
Classic 85x200cm 
Classic 100x200cm  
Doppel 80x200cm 
Mega XYZ no number 
Mega 40x250 
Mega 140x250 
Mega 240x250  
Profi 60x235cm 

php的功能natcasesort()几乎得到它的权利做了EXCEPT“ Classic no Number'和'Mega XYZ no number'不会是他们'组'中的第一个!我想让没有任何数字的项目出现在他们按字母顺序排列的数字前面。

回答

3

就是这样:

function cmp($a, $b) { 
    if ($a == $b) { 
     return 0; 
    } 
    $arr1 = str_split($a); 
    $arr2 = str_split($b); 

    $number1 = ""; 
    $number2 = ""; 

    for($i = 0; $i < count($arr1); $i++){ 
     $char1 = $arr1[$i]; 
     $char2 = $arr2[$i]; 
     if(is_numeric($char1) && !is_numeric($char2)){ 
      return 1; 
     } 
     if(!is_numeric($char1) && is_numeric($char2)){ 
      return -1; 
     } 
     else if(is_numeric($char1) && is_numeric($char2)){ 
      $number1 .= $char1; 
      $number2 .= $char2; 
     } 
     else { 
      if($char1 != $char2){ 
       if(!empty($number1) && !empty($number2)){ 
        $number1 = intval($number1); 
        $number2 = intval($number2); 
        return ($number1 < $number2) ? -1 : 1; 
       } 
       return ($char1 < $char2) ? -1 : 1; 
      } 
      else { 
       if(!empty($number1) && !empty($number2) && $number1 != $number2){ 
        $number1 = intval($number1); 
        $number2 = intval($number2); 
        return ($number1 < $number2) ? -1 : 1; 
       } 
      } 
     } 
    } 
} 

usort($arr, "cmp"); 
+0

我得到这个使用您的代码:'阵列 ( [0] =>古典85x200cm [1] =>古典100x200cm [2] =>古典一个Number [3] =>古典没有编号 [4] => Doppel 80x200cm [5] =>米加40×250 [6] =>米加240x250 [7] =>米加140x250 [8] =>米加XYZ [ 9] => Profi 60x235cm )' – 2014-11-14 15:17:42

+0

这正是欧普所要求的。 :) – 2014-11-14 15:23:39

+0

nop ...他先要字母,然后是数字。再看看;) – 2014-11-14 15:25:16

相关问题