Ale*_*lex 487 php arrays sorting object
如何通过其中一个字段对这个对象数组进行排序,比如name
或count
?
Array
(
[0] => stdClass Object
(
[ID] => 1
[name] => Mary Jane
[count] => 420
)
[1] => stdClass Object
(
[ID] => 2
[name] => Johnny
[count] => 234
)
[2] => stdClass Object
(
[ID] => 3
[name] => Kathy
[count] => 4354
)
....
Run Code Online (Sandbox Code Playgroud)
cam*_*aca 649
使用usort,这是一个改编自手册的例子:
function cmp($a, $b) {
return strcmp($a->name, $b->name);
}
usort($your_data, "cmp");
Run Code Online (Sandbox Code Playgroud)
从评论中导入的编辑:
如果您正在从类内部对数组进行排序,并且您的排序函数fn($a, $b) => $a->count - $b->count
也在类中定义,那么使用:
usort($your_data, function($a, $b) {return strcmp($a->name, $b->name);});
Run Code Online (Sandbox Code Playgroud)
小智 463
下面是使用闭包的更好方法
usort($your_data, function($a, $b)
{
return strcmp($a->name, $b->name);
});
Run Code Online (Sandbox Code Playgroud)
请注意,这不在PHP的文档中,但如果您使用5.3+闭包,则可以提供可调用的参数.
Dor*_*gal 43
如果您使用的是php oop,则可能需要更改为:
public static function cmp($a, $b)
{
return strcmp($a->name, $b->name);
}
//in this case FUNCTION_NAME would be cmp
usort($your_data, array('YOUR_CLASS_NAME','FUNCTION_NAME'));
Run Code Online (Sandbox Code Playgroud)
Rom*_*viv 42
如果要排序整数值:
// Desc sort
usort($array,function($first,$second){
return $first->number < $second->number;
});
// Asc sort
usort($array,function($first,$second){
return $first->number > $second->number;
});
Run Code Online (Sandbox Code Playgroud)
用字符串更新不要忘记转换为相同的寄存器(上部或下部)
// Desc sort
usort($array,function($first,$second){
return strtolower($first->text) < strtolower($second->text);
});
// Asc sort
usort($array,function($first,$second){
return strtolower($first->text) > strtolower($second->text);
});
Run Code Online (Sandbox Code Playgroud)
zer*_*kms 27
usort($array, 'my_sort_function');
var_dump($array);
function my_sort_function($a, $b)
{
return $a->name < $b->name;
}
Run Code Online (Sandbox Code Playgroud)
该count
字段将使用相同的代码.
更多细节usort
:http://ru2.php.net/usort
顺便问一下,你从哪里得到那个阵列?我希望不是来自数据库?
mic*_*usa 11
要对一列值进行排序,结合使用array_column()
和array_multisort()
是一种明智的方法。 演示
array_multisort(array_column($array, 'count'), $array);
Run Code Online (Sandbox Code Playgroud)
或者仅要求usort()
宇宙飞船操作员在这种情况下执行较少的迭代。演示
usort($array, fn($a, $b) => $a->count <=> $b->count);
Run Code Online (Sandbox Code Playgroud)
请注意,尽管计数值在输入数组中被转换为字符串类型值,但这两个排序函数都会正确地按数字顺序对值进行排序,而不是按字母顺序排列(错误地放在23420
before 之前420
)。这是一个可靠的默认功能。
即使您可变地声明要排序的列,这两种方法都允许在不使用任何附加技术的情况下使用变量。
$property = 'count';
array_multisort(array_column($array, $property), $array);
Run Code Online (Sandbox Code Playgroud)
$property = 'count';
usort($array, fn($a, $b) => $a->$property <=> $b->$property);
Run Code Online (Sandbox Code Playgroud)
两个本机排序函数都通过引用进行修改,因此不要尝试通过返回值访问已排序的数组。
array_multisort()
SORT_ASC
的默认排序方向是升序,因此在两个数组参数之间显式使用 是没有任何好处的。如果需要降序排序,请SORT_DESC
在两个数组之间写入(作为第二个参数)。
usort()
$a
当自定义函数体将数据放在飞船运算符的左侧并将$b
数据放在右侧时,将按升序排序。如果要按降序排序,只需将$b
数据写在左边,将$a
数据写在右边即可。
两种方法都能够接收多个排序规则,但因为这个问题只要求对单个列进行排序,所以该指南在这里是不合适的。
strcmp()
排序时在每次迭代时调用函数(如 )的效率会较低。这不再是最佳实践。也不是使用双向比较(如>
或<
)来返回布尔结果。预计将进行三向比较usort()
。
对于具有多个规则/列/属性的数据排序,这个答案提供了很好的指导。
您可以使用此功能(适用于PHP版本> = 5.3):
function sortArrayByKey(&$array,$key,$string = false,$asc = true){
if($string){
usort($array,function ($a, $b) use(&$key,&$asc)
{
if($asc) return strcmp(strtolower($a{$key}), strtolower($b{$key}));
else return strcmp(strtolower($b{$key}), strtolower($a{$key}));
});
}else{
usort($array,function ($a, $b) use(&$key,&$asc)
{
if($a[$key] == $b{$key}){return 0;}
if($asc) return ($a{$key} < $b{$key}) ? -1 : 1;
else return ($a{$key} > $b{$key}) ? -1 : 1;
});
}
}
Run Code Online (Sandbox Code Playgroud)
例:
sortArrayByKey($yourArray,"name",true); //String sort (ascending order)
sortArrayByKey($yourArray,"name",true,false); //String sort (descending order)
sortArrayByKey($yourArray,"id"); //number sort (ascending order)
sortArrayByKey($yourArray,"count",false,false); //number sort (descending order)
Run Code Online (Sandbox Code Playgroud)
如果一切都失败了,这是另一种解决方案:
$names = array();
foreach ($my_array as $my_object) {
$names[] = $my_object->name; //any object field
}
array_multisort($names, SORT_ASC, $my_array);
return $my_array;
Run Code Online (Sandbox Code Playgroud)
您可以这样使用usort
:
usort($array,function($first,$second){
return strcmp($first->name, $second->name);
});
Run Code Online (Sandbox Code Playgroud)
如果你想对日期进行排序
usort($threads,function($first,$second){
return strtotime($first->dateandtime) < strtotime($second->dateandtime);
});
Run Code Online (Sandbox Code Playgroud)