如何按對象的字段之一(例如name
或count
對這個對象數組進行排序? php
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 ) ....
這是使用閉包的更好方法 git
usort($your_data, function($a, $b) { return strcmp($a->name, $b->name); });
請注意,這不在PHP文檔中,可是若是您使用5.3+閉包,則能夠在其中提供可調用參數。 github
若是您使用的是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'));
若是須要基於本地的字符串比較,則能夠使用strcoll
而不是strcmp
。 閉包
若是須要,請記住首先將setlocale
與LC_COLLATE
一塊兒使用以設置語言環境信息。 ide
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中使用此方法,則能夠使用如下方法: oop
usort($jobs, array($this->job_model, "sortJobs")); // function inside Model usort($jobs, array($this, "sortJobs")); // Written inside Controller.
@rmooney謝謝您的建議。 真的對我有幫助。 this
若是您只須要按一個字段排序,那麼usort
是一個不錯的選擇。 可是,若是您須要按多個字段進行排序,則解決方案很快就會變得混亂。 在這種狀況下,能夠使用YaLinqo庫*, 該庫爲數組和對象實現相似於SQL的查詢語法。 對於全部狀況,它都有一個漂亮的語法: spa
$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()
以得到數組。 code
*由我開發