2014-09-04 24 views
0

我想通过它的一个元素来使用对象,但我不知道如何对包含数字的字符串进行字符串比较,并且数字的位置并不总是相同。PHP使用正确数字的字符串

例如在我的情况的值,我想排序是这样的: String (A), String (B), String bit longer 1, String bit longer 2, String bit longer 3, String bit longer 10, String bit longer 20(但不是按照这个顺序)

,如果我做一个简单的strcmp()比较usort将对其进行排序,如MySQL会这样顺序看起来是这样的:String (A), String (B), String bit longer 1, String bit longer 10, String bit longer 2, String bit longer 20, String bit longer 3这是错误的

现在我卡住了,不应该怎么做才能正确分类。

编辑:

对象我想排序如下所示:

Array 
(
    [0] => stdClass Object 
     ([field] => String (A) ... lots of other fields) 
    [1] => stdClass Object 
     ([field] => String (B) ... lots of other fields) 
    [2] => stdClass Object 
     ([field] => String bit longer 1 ... lots of other fields) 
    [3] => stdClass Object 
     ([field] => String bit longer 2 ... lots of other fields) 
    ...and so on 
) 
+0

你想要做一个自然排序? – Barmar 2014-09-04 02:50:49

+1

你看过'natsort()'吗? – Barmar 2014-09-04 02:51:32

+0

那么正确的排序是什么? – Ghost 2014-09-04 02:55:34

回答

0

对于排序字符串数组,你可以使用natsort

php > print_r($ary); 
Array 
(
    [0] => String (A) 
    [1] => String (B) 
    [2] => String bit longer 1 
    [3] => String bit longer 10 
    [4] => String bit longer 2 
    [5] => String bit longer 20 
    [6] => String bit longer 3 
) 
php > natsort($ary); 
php > print_r($ary); 
Array 
(
    [0] => String (A) 
    [1] => String (B) 
    [2] => String bit longer 1 
    [4] => String bit longer 2 
    [6] => String bit longer 3 
    [3] => String bit longer 10 
    [5] => String bit longer 20 
) 

对于财产使用natsort,strnatcmp所使用的比较函数,在您传递给的自定义比较函数中:

function natcmpfield($obj1, $obj2) { 
    return strnatcmp($obj1->fieldName, $obj2->fieldName); 
} 

usort($objArray, natcmpfield); 

例如:

php > print_r($objArray); 
Array 
(
    [0] => Example Object ([str] => String (A)) 
    [1] => Example Object ([str] => String (B)) 
    [2] => Example Object ([str] => String bit longer 1) 
    [3] => Example Object ([str] => String bit longer 10) 
    [4] => Example Object ([str] => String bit longer 2) 
    [5] => Example Object ([str] => String bit longer 20) 
    [6] => Example Object ([str] => String bit longer 3) 
) 
php > function natcmpfield($obj1, $obj2) { 
    { return strnatcmp($obj1->str, $obj2->str); 
    { } 
php > usort($objArray, natcmpfield); 
php > print_r($objArray); 
Array 
(
    [0] => Example Object ([str] => String (A)) 
    [1] => Example Object ([str] => String (B)) 
    [2] => Example Object ([str] => String bit longer 1) 
    [3] => Example Object ([str] => String bit longer 2) 
    [4] => Example Object ([str] => String bit longer 3) 
    [5] => Example Object ([str] => String bit longer 10) 
    [6] => Example Object ([str] => String bit longer 20) 
) 
+0

谢谢你现在正确的工作。我不知道发生了什么,但首先它完全分类像1,2,10,20,3,4,22,23,比重新上传编辑后的文件像魅力一样。 – 2014-09-04 03:32:22

相关问题