PHP根据另一个数组的内容对对象数组重新排序
问题描述:
我有一个从自定义Joomla内的SQL查询生成的对象数组! 1.5组件:PHP根据另一个数组的内容对对象数组重新排序
$query = 'SELECT * FROM #__orders_hearaboutus ORDER BY id';
$this->_hearaboutus = $this->_getList($query);
这会产生这样的:
Array
(
[0] => stdClass Object
(
[id] => 3
[how_heard] => Our Website
)
[1] => stdClass Object
(
[id] => 4
[how_heard] => Other Website
)
[2] => stdClass Object
(
[id] => 5
[how_heard] => Word of Mouth
)
[3] => stdClass Object
(
[id] => 6
[how_heard] => Other
)
[4] => stdClass Object
(
[id] => 10
[how_heard] => Internet Search Engine
)
[5] => stdClass Object
(
[id] => 11
[how_heard] => Local Newspaper
)
[10] => stdClass Object
(
[id] => 16
[how_heard] => Leaflet by Post
)
[11] => stdClass Object
(
[id] => 18
[how_heard] => Club or Society Newsletter
)
)
然后,这是产生“你从哪里知道我们的”一个订单内的下拉选项的HTML选择。
我希望做的是通过在所需的(任意)顺序提供的ID进行重新排序列表,假设数组是做到这一点的最好办法:
$ordering = array(11,3,4,10,16,5,18,6);
我已经找到了以这种方式重新排序数组的方法,或者通过键重新排序对象的数组,但是我无法弄清楚如何实现上述目标?
答
最直接的办法就是做在SQL:
$query = 'SELECT * FROM ... ORDER BY FIELD(id,11,3,4,10,16,5,18,6)';
http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_field
因为它真的不使用任意的主键作为排序绕圈很好的做法,你应该增加一个额外的order
专栏。
答
你可以在MySQL做到这一点像@deceze提到或PHP,使用array_multisort()
:
array_multisort($this->_hearaboutus, $ordering, SORT_ASC);
答
由@deceze提到通过的MySQL这样做很可能是做的最好的办法,但这里有一个快速的和肮脏的方式来实现你所需要的。
class testObj {
public $id;
function __construct($id) {
$this->id = $id;
}
}
$order = array(11, 3, 4, 10, 16, 5, 18, 6);
$objects = array(
new testObj(3),
new testObj(4),
new testObj(5),
new testObj(6),
new testObj(10),
new testObj(11),
new testObj(16),
new testObj(18)
);
$neworder = array();
foreach ($order as $ord) {
foreach ($objects as $obj) {
if ($obj->id == $ord) {
$neworder[] = $ord;
}
}
}
print_r($neworder);