假设我有一个对象$obj,在此foreach()循环之后:
let's say I have an object, $obj, that after this foreach() loop:
foreach($obj as $row){ echo 'file_id:'.$row->file_id.'-name:'.$row->name.'<br>'; }看起来像这样:
file_id:321-name:321-is-good file_id:322-name:322-is-better file_id:323-name:323-is-best如何对$obj进行排序,以便可以选择第一个echo和$row是什么?例如,如果我在某处插入322,结果将如下所示:
How can I sort $obj such that I can choose what is the first echo'd $row? For example, if I plugged in 322 somewhere, the result would look like this:
file_id:322-name:322-is-better file_id:323-name:323-is-best file_id:321-name:321-is-good,如果我插入了323:
file_id:323-name:323-is-best file_id:321-name:321-is-good file_id:322-name:322-is-better我知道这可能涉及到usort(),但是我无法确定需要做些什么.
I know it probably involves usort() but I can't wrap my head around what needs to be done.
有想法吗?
谢谢, 蒂姆
推荐答案假设您要在特定开始时对file_id进行排序,请附加之前的内容,该内容也按file_id进行排序:
Assuming you want to sort on file_id at a specific start, appending what comes before, which is also sorted on file_id:
$sort = '323'; usort($arr,function($a,$b) use ($sort) { //normal sorting for low-ids after high-ids if($a->file_id < $sort && $a->file_id < $sort){ return strcmp($a->file_id,$b->file_id); } //if only $a is smaller $a should be later if($a->file_id < $sort) return 1; //if only $b is smaller $a should be earlier if($b->file_id < $sort) return -1; //both above $sort, sort normally return strcmp($a->file_id,$b->file_id); });
使用对象而不是数组的工作示例:
Working example with an Object instead of a Array:
<?php //build a test with arrays is easier; $arr = new ArrayObject(array( array('file_id' => '321','name' => '321 is good'), array('file_id' => '322','name' => '322 is better'), array('file_id' => '323','name' => '323 is best'))); //cast all to object for purposes of testing objects foreach($arr as &$val) $val = (object)$val; //when you used a reference _always_ unset... trust me on this one unset($val); $sort = '323'; // we define the callback separately because for this test we use it more then once // don't pay much attention to the reference as &$sort, this is just to alter it in // multiple tests, and should not be needed in the actual implementation. $callback = function($a,$b) use (&$sort) { //normal sorting for low-ids after high-ids if($a->file_id < $sort && $b->file_id < $sort){ //$a & $b indeed, not $a twice ;) return strcmp($a->file_id,$b->file_id); } //if only $a is smaller $a should be later if($a->file_id < $sort) return 1; //if only $b is smaller $a should be earlier if($b->file_id < $sort) return -1; //both above $sort, sort normally return strcmp($a->file_id,$b->file_id); }; //322 first: $sort='322'; $arr->uasort($callback); var_dump($arr); //323 first: $sort='323'; $arr->uasort($callback); var_dump($arr); //321 again first: $sort='321'; $arr->uasort($callback); var_dump($arr); //non-existing: $sort='400'; $arr->uasort($callback); var_dump($arr); object(ArrayObject)#1 (1) { ["storage":"ArrayObject":private]=> array(3) { [1]=> object(stdClass)#5 (2) { ["file_id"]=> string(3) "322" ["name"]=> string(13) "322 is better" } [2]=> object(stdClass)#6 (2) { ["file_id"]=> string(3) "323" ["name"]=> string(11) "323 is best" } [0]=> object(stdClass)#4 (2) { ["file_id"]=> string(3) "321" ["name"]=> string(11) "321 is good" } } } object(ArrayObject)#1 (1) { ["storage":"ArrayObject":private]=> array(3) { [2]=> object(stdClass)#6 (2) { ["file_id"]=> string(3) "323" ["name"]=> string(11) "323 is best" } [0]=> object(stdClass)#4 (2) { ["file_id"]=> string(3) "321" ["name"]=> string(11) "321 is good" } [1]=> object(stdClass)#5 (2) { ["file_id"]=> string(3) "322" ["name"]=> string(13) "322 is better" } } } object(ArrayObject)#1 (1) { ["storage":"ArrayObject":private]=> array(3) { [0]=> object(stdClass)#4 (2) { ["file_id"]=> string(3) "321" ["name"]=> string(11) "321 is good" } [1]=> object(stdClass)#5 (2) { ["file_id"]=> string(3) "322" ["name"]=> string(13) "322 is better" } [2]=> object(stdClass)#6 (2) { ["file_id"]=> string(3) "323" ["name"]=> string(11) "323 is best" } } } object(ArrayObject)#1 (1) { ["storage":"ArrayObject":private]=> array(3) { [0]=> object(stdClass)#4 (2) { ["file_id"]=> string(3) "321" ["name"]=> string(11) "321 is good" } [1]=> object(stdClass)#5 (2) { ["file_id"]=> string(3) "322" ["name"]=> string(13) "322 is better" } [2]=> object(stdClass)#6 (2) { ["file_id"]=> string(3) "323" ["name"]=> string(11) "323 is best" } } }