2011-01-09 206 views
7

值順序我有像這樣兩個PHP數組:兩個PHP陣列 - 排序一個陣列與另一

  1. 的包含ID的WordPress帖子的 (在一個特定的 順序)X記錄
  2. 陣列
  3. 陣列WordPress的帖子

兩個數組中是這個樣子:

陣列中的一個(WordPress的帖子ID的排序自定義陣列)

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

陣列中的兩個(WordPress的帖子陣列)

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的帖子的數組編號的的順序進行排序第一個數組。

我希望這是有道理的,並提前感謝任何幫助。

湯姆

編輯:服務器運行的PHP版本5.2.14

回答

9

這應該是使用usort,其排序使用用戶定義的比較函數數組相當容易。結果可能是這個樣子:

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

請注意,此解決方案,因爲它使用anonymous functions and closures,需要PHP 5.3。 (!黑暗時代)


一個簡單的解決方案,這種預5.3是一個快速循環來做到這一點,然後ksort

$ret = array(); 
$post_ids = array_flip($post_ids); 
foreach ($posts as $post) { 
    $ret[$post_ids[$post->ID]] = $post; 
} 
ksort($ret); 
2

您可以創建一個嵌套的循環機制,以訂單和ID匹配起來,重建一個新的職位陣列。

$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 

     } 

    } 

} 
+0

製作這兩個數組的副本(這就是foreach所做的)在這裏是不必要的。 – 2011-01-09 22:39:22

+0

謝謝你的回答。這樣做的工作,但似乎有點呆滯?我已經接受了答案,因爲它確實符合我的要求,並且可以使用PHP 5.2 – Tisch 2011-01-09 22:53:08

+0

對不起@jondavidjohn,我不得不切換到更快的解決方案。再次感謝。 – Tisch 2011-01-09 23:13:18

2
$sortOrderMap = array_flip($postIds); 

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

你可以簡單地從減去B而不是從b排序另一個方向