#php #joomla1.5 #sorting
#php #joomla1.5 #сортировка
Вопрос:
У меня есть массив объектов, который генерируется из SQL-запроса в пользовательской Joomla! 1.5 компонент:
$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-вариант выбора «Где вы слышали о нас» в форме заказа.
Что я хотел бы сделать, так это изменить порядок списка, указав идентификаторы в желаемом (произвольном) порядке, предполагая, что массив — лучший способ сделать это:
$ordering = array(11,3,4,10,16,5,18,6);
Я нашел способы переупорядочивания массивов таким образом или переупорядочивания массивов объектов по ключам, но я не могу понять, как достичь вышеуказанного?
Ответ №1:
Самый простой способ — сделать это в 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
столбец для этой цели.
Ответ №2:
Вы можете сделать это в MySQL, как упоминалось в @deceze, или в PHP, используя array_multisort()
:
array_multisort($this->_hearaboutus, $ordering, SORT_ASC);
Ответ №3:
Выполнение этого через MySQL, как упоминалось @deceze, вероятно, лучший способ сделать это, но вот быстрый и грязный способ достижения того, что вам нужно.
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 );