2014-03-03 68 views
0

我想對數組進行數值排序,但整數是在值的中間找到的,而不是第一個字符。這裏是我的陣列看起來像(使用虛擬值):的foreach後排序php數組中的整數值

$array = Array('A25','A30','A40','B25','B30','B40','AB25','AB30','AB40'); 

sort($array,1); 

輸出:

A25 
A30 
A40 

AB25 
AB30 
AB40 

B25 
B30 
B40 

預期輸出:

A25 
AB25 
B25 

A30 
AB30 
B30 

A40 
AB40 
B40 

什麼是我們的最佳排序方法?非常感謝,謝謝!

+0

你應該嘗試一個解決方案,併發布代碼,你堅持 – Coderchu

+0

@d_ominic嗨感謝您花時間閱讀本文。我被困在什麼排序方法會爲我正在尋找的輸出工作。 – Elmer

+2

你爲什麼期待A25之前的AB25? –

回答

3
$array = Array('A25','A30','A40','B25','B30','B40','AB25','AB30','AB40'); 
usort(
    $array, 
    function($a, $b) { 
     list($achar,$anum) = sscanf($a, '%[A-Z]%d'); 
     list($bchar,$bnum) = sscanf($b, '%[A-Z]%d'); 
     if ($anum > $bnum) { 
      return 1; 
     } elseif (($anum == $bnum) && ($achar > $bchar)) { 
      return 1; 
     } 
     return -1; 
    } 
); 

var_dump($array); 
0

已創建根據您的需求自定義函數,請參見下面的代碼

<?php 

$array = array('A30','A25','ZZZ','A40','Rohan','B25','B30','Sakhale','B40','AB25','AB30','AB40'); 
$array = sortArrayByNumber($array); 

var_dump($array); 

/** 
* @name sortArrayByNumber 
* @abstract sort the entire array irrespective of the string, but the numbers into it 
*    also we append the elements not having any number at the end 
* @author Rohan Sakhale 
*/ 
function sortArrayByNumber($arr){ 
    $sortedArr = array(); 
    $tempArray = array(); 
    $stringOnlyArray = array(); 
    foreach($arr as $v){ 
     $num = getNumberFromString($v); 
     /** 
     * If no number found, append it into stringOnlyArray 
     */ 
     if($num == ''){ 
      $stringOnlyArray[] = $v; 
      continue; 
     } 
     if(!isset($tempArray[$num])){ 
      $tempArray[$num] = array(); 
     } 
     $tempArray[$num][] = $v; 
    } 
    $tempArrayKeys = array_keys($tempArray); 
    sort($tempArrayKeys); 
    foreach($tempArrayKeys as $key){ 
    sort($tempArray[$key]); 
     $sortedArr = array_merge($sortedArr, $tempArray[$key]); 
    } 
    if(count($stringOnlyArray) > 0){ 
     sort($stringOnlyArray); 
     $sortedArr = array_merge($sortedArr, $stringOnlyArray); 
    } 
    return $sortedArr; 
} 

/** 
* @str - String param which tend to have number 
*/ 
function getNumberFromString($str){ 
    $matches = null; 
    preg_match_all('!\d+!', $str, $matches); 
    if(!is_null($matches) and is_array($matches)){ 
     if(isset($matches[0][0])){ 
      return $matches[0][0]; 
     } 
    } 
    return ''; 
} 

?> 

這裏排序數方法試圖首先識別數字的字符串中的,並保持它的一個單獨的數組基於鍵,以後我們升序排序每一個關鍵數量的,然後我們終於將其合併到有序數組

0

您可以使用用戶定義的函數usort實現它

<?php 

function mySort($a,$b) { 
    $numA = ''; 
    $strA = ''; 
    $numB = ''; 
    $strB = ''; 
    for($i=0;$i<strlen($a); $i++) { 
     if(is_numeric($a[$i])) { 
      $numA .= (string)$a[$i]; 
     } 
     else { 
      $strA .= $a[$i]; 
     } 
    } 
    for($i=0;$i<strlen($b); $i++) { 
     if(is_numeric($b[$i])) { 
      $numB .= (string)$b[$i]; 
     } 
     else { 
      $strB .= $b[$i]; 
     } 
    } 
    $numA = (int)$numA; 
    $numB = (int)$numB; 
    if($numA>$numB) { 
     return true; 
    } 
    elseif($numA<$numB) { 
     return false; 
    } 
    else { 
     if(strcmp($strA,$strB)>0) { 
      return true; 
     } 
     else { 
      return false; 
     } 
    } 
} 

$array = Array('A25','A30','A40','B25','B30','B40','AB25','AB30','AB40'); 
var_dump($array); 
usort($array,'mySort'); 
var_dump($array); 
?> 
0

這裏是一個穩定的排序,結果是:「A25」「B25」「AB25」「A30」「B30」「AB30」「A40」「B40」「AB40」。

function getNum($str) 
{ 
    preg_match ('/(\d+)$/', $str, $match); 

    return intval ($match [1]); 
} 

function stableSort($arr) 
{ 
    $newArr = array(); 

    foreach ($arr as $idx => $ele) 
    { 
     $newArr [] = array (
       'idx' => $idx, 
       'val' => $ele 
     ); 
    } 

    usort ($newArr, 
      function ($a, $b) 
      { 
       $d = getNum ($a ['val']) - getNum ($b ['val']); 
       return $d ? $d : $a ['idx'] - $b ['idx']; 
      }); 

    $sortArr = array(); 

    foreach ($newArr as $ele) 
    { 

     $sortArr [] = $ele ['val']; 
    } 

    return $sortArr; 
} 

var_dump (stableSort ($array)); 
0

U可以使用各種方式對PHP中的數組進行排序。 PHP有一些很好的方法可以對數組進行排序。在這種情況下,我同意馬克貝克,但我會建議preg_replace獲得您的字符串的數值。

$array = Array('A25','A30','A40','B25','B30','B40','AB25','AB30','AB40'); 
function cmp($a, $b) 
{ 
    $v1 = preg_replace("/[^0-9]/", "", $a); 
    $v2 = preg_replace("/[^0-9]/", "", $b); 
    if ($v1 == $v2) { 
     return 0; 
    } 
    return ($v1 < $v2) ? -1 : 1; 
} 
usort($array, "cmp"); 
var_dump($array); 

查看有關排序數組,php.net/usort和其他各種PHP信息。