按值内的整数对php数组排序
我试图对数组进行数值排序,但是整数是在值的中间找到的,而不是在第一个字符上找到的。以下是我的数组的外观(使用伪值): foreach之后的输出:按值内的整数对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
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你好