按对象字段sorting对象数组
我怎样才能sorting这个对象的数组,如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 ) .... 
	
使用usort ,这里是一个从手册改编的例子:
 function cmp($a, $b) { return strcmp($a->name, $b->name); } usort($your_data, "cmp"); 
从评论导入的编辑:
 如果你是从类内sorting数组,并且你的sorting函数cmp也是在类内定义的,那么使用下面的代码: 
 usort($your_data, array($this, "cmp")) 
inheritance人更好的方式使用闭包
 usort($your_data, function($a, $b) { return strcmp($a->name, $b->name); }); 
请注意,这不是在PHP的文档,但如果您使用5.3+闭包支持可调参数可以提供。
如果你使用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: 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; }); } } 
例:
 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) 
如果你想sorting整数值:
 // Desc sort usort($array,function($first,$second){ return $first->number < $second->number; }); // Asc sort usort($array,function($first,$second){ return $first->number > $second->number; }); 
 如果您需要本地string比较,您可以使用strcoll而不是strcmp 。 
 记住如果需要,首先使用LC_COLLATE设置setlocale来设置语言环境信息。 
  usort($your_data,function($a,$b){ setlocale (LC_COLLATE, 'pl_PL.UTF-8'); // Example of Polish language collation return strcoll($a->name,$b->name); }); 
如果你在Codeigniter中使用这个,你可以使用下面的方法:
 usort($jobs, array($this->job_model, "sortJobs")); // function inside Model usort($jobs, array($this, "sortJobs")); // Written inside Controller. 
@ rmooney谢谢你的build议。 这真的帮助我。
所有答案的缺点是他们使用静态字段名称,所以我写了一个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 ,就像这样: 
 usort($array,function($first,$second){ return strcmp($first->name, $second->name); }); 
 如果你只需要一个字段进行sorting,那么usort是一个不错的select。 但是,如果您需要按多个字段进行sorting,则解决scheme很快就会变得杂乱无章。 在这种情况下,可以使用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; }的缩写function ($v) { return $v->count; }  function ($v) { return $v->count; } (可以使用)。 这些方法链返回迭代器,但是如果需要的话,可以通过添加->toArray()来获得数组。 
*由我开发
您可以使用Nspl中的 sorting函数:
 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')); 
感谢灵感,我还必须添加一个外部的$ translator参数
 usort($listable_products, function($a, $b) { global $translator; return strcmp($a->getFullTitle($translator), $b->getFullTitle($translator)); });