I have two PHP arrays like so:
- Array of X records containing the ID of Wordpress posts (in a particular order)
- Array of Wordpress posts
The two arrays look something like this:
Array One (Sorted Custom Array of Wordpress Post IDs)
Array (
[0] => 54
[1] => 10
[2] => 4
)
Array Two (Wordpress Post Array)
Array (
[0] => stdClass Object
(
[ID] => 4
[post_author] => 1
)
[1] => stdClass Object
(
[ID] => 54
[post_author] => 1
)
[2] => stdCla开发者_如何学编程ss Object
(
[ID] => 10
[post_author] => 1
)
)
I would like to sort the array of wordpress posts with the order of the ID's in the first array.
I hope this makes sense, and thanks in advance of any help.
Tom
edit: The server is running PHP Version 5.2.14
This should be quite easy using usort
, which sorts the array using a user-defined comparison function. The result might look something like this:
usort($posts, function($a, $b) use ($post_ids) {
return array_search($a->ID, $post_ids) - array_search($b->ID, $post_ids);
});
Note that this solution, since it uses anonymous functions and closures, requires PHP 5.3.
One easy solution for this pre-5.3 (the dark ages!) is to do this with a quick loop and then ksort
:
$ret = array();
$post_ids = array_flip($post_ids);
foreach ($posts as $post) {
$ret[$post_ids[$post->ID]] = $post;
}
ksort($ret);
You could create a nested looping mechanism to match up the order and ids and rebuild a new post array.
$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
}
}
}
$sortOrderMap = array_flip($postIds);
usort($posts, function($postA, $postB) use ($sortOrderMap) {
return $sortOrderMap[$postA->ID] - $sortOrderMap[$postB->ID];
});
You can simply subtract b from a instead of a from b to sort the other direction
精彩评论