2011-01-09 18 views
7

の値の順序にソートつのアレイIは、2つのPHP配列のでよう有する:(特に ために)ID Wordpressのポストの を含むXレコード の2 PHPの配列 - 他

  1. アレイ

    アレイワン:Wordpressのポストの

  2. アレイ

二つの配列は次のようになり私はIDの中の順序で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 
    ) 
) 

最初の配列。

これは意味があることを願っており、事前に感謝しています。

トム

編集:サーバーは、あなたが順序とIDを一致して、新しいポストのアレイを再構築するために、ネストされたループ・メカニズムを作成することができますPHPのバージョン5.2.14

答えて

9

これは、ユーザ定義の比較関数を用いて配列をソートした、usortを用いて非常に簡単であるべきです。それはanonymous functions and closuresを使用していますので、このソリューションは、PHP 5.3を必要とすることが

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

注:結果は次のようになります。 (!暗黒時代)この前5.3用


一つの簡単な解決策は、迅速なループでこれを行うことですし、その後ksort:あなたは、単にからBを引くことができ

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

私はまったく同じ解決策を入力していました、+1。 PS:この機能の前後にarray_flip $ post_idsする必要があると思います。 –

+0

@Richard Tuinそれは1つの解決策になります - もう1つは 'array_search'を使うことです。私は自分のポストを使って修正する途中です。 – lonesomeday

+0

これは非常に洗練されたソリューションのように見えますが、私がこれを試して実装すると、関数が何をすべきか混乱しています。 私はここから直接コピーします: 構文解析エラー:予期しない構文エラーT_FUNCTION ----私は比較を行う関数を作成する必要があると思いますか? (間違いの言い訳も...私は遅い瞬間を持っていることは間違いない)...編集:これを読んでhttp://php.net/manual/en/function.usort.phpは少し明確にするようだしかし、まだ立ち往生! – Tisch

2

を実行しています。

$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と同じです)ここでは不必要です。 –

+0

あなたの答えをありがとう。これは仕事をしますが、ちょっと遅いですね?私はそれが私が探していることをやっているので、とにかく答えを受け入れました。PHP 5.2で動作します。 – Tisch

+0

申し訳ありません@jondavidjohn、私はより高速なソリューションに切り替える必要がありました。再度、感謝します。 – Tisch

2
$sortOrderMap = array_flip($postIds); 

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

aからbの代わりに他の方向をソートする

+0

あなたの答えにもよろしいですか...上記の解決策は非常に似ていますので、私は可能ならばそれを追求します。 PHP 5.2が私を止めているように見える:( – Tisch