два массива php - сортировка одного массива по порядку значений другого - PullRequest
7 голосов
/ 10 января 2011

У меня есть два PHP-массива, например:

  1. Массив X записей, содержащих идентификатор постов WordPress (в частности заказ)
  2. Массив сообщений Wordpress

Два массива выглядят примерно так:

Array One (отсортированный пользовательский массив идентификаторов сообщений Wordpress)

Array (  
  [0] => 54
  [1] => 10
  [2] => 4
)

Массив два (Wordpress Post Array)

Array ( 
    [0] => stdClass Object
        (
            [ID] => 4
            [post_author] => 1
    )
    [1] => stdClass Object
        (
            [ID] => 54
            [post_author] => 1
    )
    [2] => stdClass Object
        (
            [ID] => 10
            [post_author] => 1
    )
)

Я бы хотел отсортировать массив записей WordPress по порядку идентификаторов в первом массиве.

Надеюсь, это имеет смысл, и заранее спасибо за любую помощь.

Tom

edit: сервер работает под управлением PHP версии 5.2.14

Ответы [ 3 ]

10 голосов
/ 10 января 2011

Это должно быть довольно просто, используя usort, который сортирует массив с помощью пользовательской функции сравнения.Результат может выглядеть примерно так:

usort($posts, function($a, $b) use ($post_ids) {
    return array_search($a->ID, $post_ids) - array_search($b->ID, $post_ids);
});

Обратите внимание, что это решение, поскольку оно использует анонимные функции и замыкания , требует PHP 5.3.


Oneпростое решение для этой предварительной версии 5.3 (темные века!) состоит в том, чтобы сделать это с помощью быстрой петли, а затем ksort:

$ret = array();
$post_ids = array_flip($post_ids);
foreach ($posts as $post) {
    $ret[$post_ids[$post->ID]] = $post;
}
ksort($ret);
2 голосов
/ 10 января 2011
$sortOrderMap = array_flip($postIds);

usort($posts, function($postA, $postB) use ($sortOrderMap) {
    return $sortOrderMap[$postA->ID] - $sortOrderMap[$postB->ID];
});

Вы можете просто вычесть b из a вместо a из b, чтобы отсортировать другое направление

2 голосов
/ 10 января 2011

Вы можете создать механизм вложенных циклов для сопоставления порядка и идентификаторов и перестроить новый массив записей.

$new_post_array = array();

foreach($id_array as $id) {          //loop through custom ordered ids

    foreach($post_array as $post) {  //for every id loop through posts

        if($id == $post->ID){         //and when the custom ordered id matches the post->ID

            new_array[] = $post       //push the post on the new array

        }

    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...