按值内的整数对php Array进行排序

时间:2014-03-03 07:59:09

标签: php arrays

我正在尝试以数字方式对数组进行排序,但整数位于值的中间,而不是第一个字符。这是我的数组的样子(使用虚拟值):

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

sort($array,1);

foreach之后的输出:

A25
A30
A40

AB25
AB30
AB40

B25
B30
B40

预期产出:

A25
AB25
B25

A30
AB30
B30

A40
AB40
B40

最好的排序方法是什么?非常感谢,谢谢!

5 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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 '';
}

?>

这里按数字排序方法试图首先识别字符串中的数字,并根据键维护一个单独的数组,然后我们按照每个键的数字按升序排序,然后我们最终将它合并到排序数组< / p>

答案 2 :(得分:0)

您可以使用用户定义的函数来实现它

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

答案 3 :(得分: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 ) );

答案 4 :(得分:0)

你可以使用各种方法在PHP中对数组进行排序。 PHP有一些很好的方法可以在数组上进行排序。在这种情况下,我同意Mark Ba​​ker,但我会建议使用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信息,php.net/usort以及其他各种数据。