Answers:
使用usort,这是从手册改编而成的示例:
function cmp($a, $b) {
return strcmp($a->name, $b->name);
}
usort($your_data, "cmp");
您还可以将任何callable用作第二个参数。这里有些例子:
使用匿名函数(来自PHP 5.3)
usort($your_data, function($a, $b) {return strcmp($a->name, $b->name);});
从班级内部
usort($your_data, array($this, "cmp")); // "cmp" should be a method in the class
使用箭头函数(来自PHP 7.4)
usort($your_data, fn($a, $b) => strcmp($a->name, $b->name));
另外,如果要比较数字值,fn($a, $b) => $a->count - $b->count
则应使用“比较”功能。
这是使用闭包的更好方法
usort($your_data, function($a, $b)
{
return strcmp($a->name, $b->name);
});
请注意,这不在PHP文档中,但是如果您使用5.3+闭包,则可以在其中提供可调用参数。
uasort()
-1 * strcmp($a->name, $b->name);
strcmp($b->name, $a->name)
usort
但比较功能相同。使用此方法,您需要复制闭包的代码,而不是对protected static
方法的调用,您只需在父类中定义一次即可。
如果要对整数值进行排序:
// Desc sort
usort($array,function($first,$second){
return $first->number < $second->number;
});
// Asc sort
usort($array,function($first,$second){
return $first->number > $second->number;
});
用字符串更新不要忘了转换为相同的寄存器(高位或低位)
// 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);
});
如果您使用的是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'));
usort($array, 'my_sort_function');
var_dump($array);
function my_sort_function($a, $b)
{
return $a->name < $b->name;
}
该count
字段将使用相同的代码。
有关的更多详细信息usort
:http : //ru2.php.net/usort
顺便说一句,您是从哪里获得该阵列的?我希望不是从数据库?
$result
将包含TRUE
,您的比较应该为$a->name > $b->name
。:)
ORDER BY count
create_function('$a,$b', "return $a->count < $b->count;")
但是我无法使其工作:(我收到一些通知并警告说usort期望参数2是有效的回调
您可以使用此功能(在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;
});
}
}
例:
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)
$a->{$key}
和$b->{$key}
,而不是$a[$key]
和$b[$key]
,因为我们是严格来说,处理性能,而不是阵列成员,但是这仍然是我一直在寻找的答案。
如果一切失败,这是另一种解决方案:
$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;
这里所有答案的缺点是它们使用静态字段名称,因此我以OOP风格编写了调整后的版本。假设您使用的是getter方法,则可以直接使用此类,并将字段名称用作参数。可能有人觉得它有用。
class CustomSort{
public $field = '';
public function cmp($a, $b)
{
/**
* field for order is in a class variable $field
* using getter function with naming convention getVariable() we set first letter to uppercase
* we use variable variable names - $a->{'varName'} would directly access a field
*/
return strcmp($a->{'get'.ucfirst($this->field)}(), $b->{'get'.ucfirst($this->field)}());
}
public function sortObjectArrayByField($array, $field)
{
$this->field = $field;
usort($array, array("Your\Namespace\CustomSort", "cmp"));;
return $array;
}
}
如果要排序日期
usort($threads,function($first,$second){
return strtotime($first->dateandtime) < strtotime($second->dateandtime);
});
如果您只需要按一个字段排序,那usort
是一个不错的选择。但是,如果您需要按多个字段进行排序,则解决方案很快就会变得混乱。在这种情况下,可以使用YaLinqo库* ,该库为数组和对象实现类似于SQL的查询语法。对于所有情况,它都有一个漂亮的语法:
$sortedByName = from($objects)->orderBy('$v->name');
$sortedByCount = from($objects)->orderBy('$v->count');
$sortedByCountAndName = from($objects)->orderBy('$v->count')->thenBy('$v->name');
在这里,'$v->count'
是function ($v) { return $v->count; }
(两者都可以使用)的简写。这些方法链返回迭代器,但是->toArray()
如果需要,可以通过在最后添加来获得数组。
*由我开发
use function \nspl\a\sorted;
use function \nspl\op\propertyGetter;
use function \nspl\op\methodCaller;
// Sort by property value
$sortedByCount = sorted($objects, propertyGetter('count'));
// Or sort by result of method call
$sortedByName = sorted($objects, methodCaller('getName'));
您可以像这样使用usort
如果要按数字排序:
function cmp($a, $b)
{
if ($a == $b) {
return 0;
}
return ($a < $b) ? -1 : 1;
}
$a = array(3, 2, 5, 6, 1);
usort($a, "cmp");
或Abc char:
function cmp($a, $b)
{
return strcmp($a["fruit"], $b["fruit"]);
}
$fruits[0]["fruit"] = "lemons";
$fruits[1]["fruit"] = "apples";
$fruits[2]["fruit"] = "grapes";
usort($fruits, "cmp");