PHP Переупорядочивает массив объектов на основе содержимого другого массива

#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 );