Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/254.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
按值内的整数对php数组排序_Php_Arrays - Fatal编程技术网

按值内的整数对php数组排序

按值内的整数对php数组排序,php,arrays,Php,Arrays,我试图对数组进行数值排序,但是整数是在值的中间找到的,而不是在第一个字符上找到的。以下是我的数组的外观(使用伪值): foreach之后的输出: A25 A30 A40 AB25 AB30 AB40 B25 B30 B40 预期产出: A25 AB25 B25 A30 AB30 B30 A40 AB40 B40 什么是最好的分类方法?非常感谢,谢谢 已根据您的要求创建了自定义函数,请参见下面的代码 $array = Array('A25','A30','A40','B25','B30

我试图对数组进行数值排序,但是整数是在值的中间找到的,而不是在第一个字符上找到的。以下是我的数组的外观(使用伪值):

foreach之后的输出:

A25
A30
A40

AB25
AB30
AB40

B25
B30
B40
预期产出:

A25
AB25
B25

A30
AB30
B30

A40
AB40
B40

什么是最好的分类方法?非常感谢,谢谢

已根据您的要求创建了自定义函数,请参见下面的代码

$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);
<?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 '';
}

?>


这里的“按数字排序”方法试图首先识别字符串中的数字,并根据键维护一个单独的数字数组,然后按升序对每个数字键进行排序,最后将其合并到排序数组中。

根据您的要求创建了一个自定义函数,请参见下面的代码

<?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 '';
}

?>


这里的“按数字排序”方法试图首先识别字符串中的数字,并根据键维护一个单独的数字数组,然后按升序对每个数字键进行排序,最后将其合并到排序数组中。

根据您的要求创建了一个自定义函数,请参见下面的代码

<?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 '';
}

?>


这里的“按数字排序”方法试图首先识别字符串中的数字,并根据键维护一个单独的数字数组,然后按升序对每个数字键进行排序,最后将其合并到排序数组中。

根据您的要求创建了一个自定义函数,请参见下面的代码

<?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 '';
}

?>


这里的“按数字排序”方法试图首先识别字符串中的数字,并根据键维护一个单独的数字数组,然后我们按升序对每个数字键进行排序,最后将其合并到排序数组中。

您可以使用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);
?>

您可以将用户定义的函数与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);
?>

您可以将用户定义的函数与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);
?>

您可以将用户定义的函数与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);
?>

这里有一个稳定的排序,结果是:“A25”“B25”“AB25”“A30”“B30”“AB30”“A40”“B40”“AB40”


这是一个稳定的排序,结果是:“A25”“B25”“AB25”“A30”“B30”“AB30”“A40”“B40”“AB40”


这是一个稳定的排序,结果是:“A25”“B25”“AB25”“A30”“B30”“AB30”“A40”“B40”“AB40”


这是一个稳定的排序,结果是:“A25”“B25”“AB25”“A30”“B30”“AB30”“A40”“B40”“AB40”


在PHP中,您可以使用各种方法对数组进行排序。PHP内置了一些很好的方法来对数组进行排序。在这种情况下,我同意Mark Baker的观点,但是我建议使用
preg\u 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);
$array=array('A25','A30','A40','B25','B30','B40','AB25','AB30','AB40');
功能cmp($a$b)
{
$v1=preg_替换(“/[^0-9]/”,“,$a);
$v2=preg_replace(“/[^0-9]/”,“,$b);
如果($v1=$v2){
返回0;
}
回报率($v1<$v2)?-1:1;
}
usort($数组,“cmp”);
变量转储($数组);

查看有关排序数组和其他各种排序的PHP信息。

U可以使用各种方法在PHP中对数组进行排序。PHP内置了一些很好的方法来对数组进行排序。在这种情况下,我同意Mark Baker的观点,但是我建议使用
preg\u 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);
$array=array('A25','A30','A40','B25','B30','B40','AB25','AB30','AB40');
功能cmp($a$b)
{
$v1=preg_替换(“/[^0-9]/”,“,$a);
$v2=preg_replace(“/[^0-9]/”,“,$b);
如果($v1=$v2){
返回0;
}
回报率($v1<$v2)?-1:1;
}
usort($数组,“cmp”);
变量转储($数组);

查看有关排序数组和其他各种排序的PHP信息。

U可以使用各种方法在PHP中对数组进行排序。PHP内置了一些很好的方法来对数组进行排序。在这种情况下,我同意Mark Baker的观点,但是我建议使用
preg\u 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);
$array=array('A25','A30','A40','B25','B30','B40','AB25','AB30','AB40');
功能cmp($a$b)
{
$v1=preg_替换(“/[^0-9]/”,“,$a);
$v2=preg_replace(“/[^0-9]/”,“,$b);
如果($v1=$v2){
返回0;
}
回报率($v1<$v2)?-1:1;
}
usort($数组,“cmp”);
变量转储($数组);

查看有关排序数组和其他各种排序的PHP信息。

U可以使用各种方法在PHP中对数组进行排序。PHP内置了一些很好的方法来对数组进行排序。在这种情况下,我同意Mark Baker的观点,但是我建议使用
preg\u 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);
$array=array('A25','A30','A40','B25','B30','B40','AB25','AB30','AB40');
功能cmp($a$b)
{
$v1=preg_替换(“/[^0-9]/”,“,$a);
$v2=preg_replace(“/[^0-9]/”,“,$b);
如果($v1=$v2){
返回0;
}
回报率($v1<$v2)?-1:1;
}
usort($数组,“cmp”);
变量转储($数组);


查看有关排序数组和其他各种排序的PHP信息。

您应该尝试一种解决方案并发布卡住的代码on@d_ominic您好,感谢您抽出时间阅读此文章。我一直在想什么样的排序方法对我要查找的输出有效。为什么你希望在A25之前有AB25?@MarkBaker啊,谢谢你指出了这个标记。更正。使用稳定排序,结果将是“A25”“B25”“AB25”“A30”“B30”“AB30”“A40”“B40”“AB40”。您应该尝试解决方案并发布卡住的代码on@d_ominic您好,感谢您抽出时间阅读此文章。我一直在想什么样的排序方法对我要查找的输出有效。为什么你希望在A25之前有AB25?@MarkBaker啊,谢谢你指出了这个标记。更正。使用稳定排序,结果将是“A25”“B25”“AB25”“A30”“B30”“AB30”“A40”“B40”“AB40”。您应该尝试解决方案并发布卡住的代码on@d_ominic你好