开发者

two php arrays - sort one array with the value order of another

开发者 https://www.devze.com 2023-02-03 02:56 出处:网络
I have two PHP arrays like so: Array of X records containing the ID of Wordpress posts (in a particular

I have two PHP arrays like so:

  1. Array of X records containing the ID of Wordpress posts (in a particular order)
  2. 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

0

精彩评论

暂无评论...
验证码 换一张
取 消