Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/271.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 usort字符串_Php_String_Object_Usort - Fatal编程技术网

正确使用数字的PHP usort字符串

正确使用数字的PHP usort字符串,php,string,object,usort,Php,String,Object,Usort,我想通过一个元素对一个对象进行排序,但我不确定如何对包含数字的字符串进行字符串比较,并且数字的位置并不总是相同的 例如,在我的例子中,我要排序的值如下所示: 字符串(A)、字符串(B)、字符串位长1、字符串位长2、字符串位长3、字符串位长10、字符串位长20(但不按此顺序) 如果我做一个简单的strcmp()比较,usort将像mysql一样对其排序,因此顺序如下:String(a),String(B),String bit longer 1,String bit longer 10,Strin

我想通过一个元素对一个对象进行排序,但我不确定如何对包含数字的字符串进行字符串比较,并且数字的位置并不总是相同的

例如,在我的例子中,我要排序的值如下所示:
字符串(A)、字符串(B)、字符串位长1、字符串位长2、字符串位长3、字符串位长10、字符串位长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
)

对于字符串数组的排序,可以使用:

对于较大对象的属性,请在传递给
usort
的自定义比较函数中使用
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)
)

你想进行自然排序吗?你看过
natsort()
?那么正确的排序是什么呢?@Ghost正确的排序就像我的第一个例子1,2,3,10,20@LaciK然后你可以使用下面的马克·里德斯答案,应该是正确的答案。谢谢你,它现在工作正常了。我不知道发生了什么,但首先它完全按照1,2,10,20,3,4,22,23的顺序排序,而在重新加载编辑过的文件后,它的效果非常好。
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)
)