正确使用数字的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)
)