2015-04-27 55 views
2

我有兩個簡單的數組。一個是一個帖子數組($ posts),另一個是一個帖子ID數組,應該在流的頂部,就像他們的特色($ featured)。我試圖找到一種有效的方法來循環它們,如果兩個數組中都有一個ID,請將其移動到$ posts數組的開頭,並且移動的數據應該按$ featured ['order']對ASC進行排序,因此,例如,某些職位($個):如何對基於第二個數組的PHP數組進行排序?

Array 
(
    [ab77] => Status_Update Object 
     (
      [id] => ab77 
      [title] => Status Update 
     ) 

    [b4k7] => Status_Update Object 
     (
      [id] => b4k7 
      [title] => Status Update 
     ) 
    [4d55] => Status_Update Object 
     (
      [id] => 4d55 
      [title] => Status Update 
     ) 

    [13c5] => Status_Update Object 
     (
      [id] => 13c5 
      [title] => Status Update 
     ) 

    [3aa2] => Status_Update Object 
      (
       [id] => 3aa2 
       [title] => Status Update 
      ) 
) 

,然後一些職位應精選($精選):

Array 
(
    [13c5] => Array 
     (
      [id] => 13c5 
      [order] => 1 
     ) 

    [3a71] => Array 
     (
      [id] => 3a71 
      [order] => 2 
     ) 

    [4d55] => Array 
     (
      [id] => 4d55 
      [order] => 3 
     ) 

) 

所以$柱陣列應該結束了排序是這樣:

13c5 4d55 ab77 bk47 3aa2

如何在沒有一堆慢循環的情況下執行此操作?

+0

看起來你已經得到了ID爲數組鍵了,所以你不會需要嵌套的循環 - 只有一個和裏面你可以檢查'array_key_exists(「13C5」,$功能))'等 –

+0

如果可能,我會首先正確地構建陣列。這很可能會更快更優雅。這聽起來像你想從兩個現有的查詢中創建一個新的數據陣列。我的建議是創建一個新的查詢,爲您提供所需的數據,而不是操縱現有數據。這可能不適合你的情況,但在很多情況下是這樣。 – DutGRIFF

+0

使用'uksort'使用用戶編寫的比較函數進行排序。該函數應該使用'array_key_exists'來檢查兩個鍵是否位於精選數組中。如果他們都在或不在,用'<'來比較他們。 – Barmar

回答

3

這應該是可行的與uksort()closures

uksort($posts, function ($a, $b) use ($featured) { 
    $fa = (isset($featured[$a]) ? $featured[$a]['order'] : INF); 
    $fb = (isset($featured[$b]) ? $featured[$b]['order'] : INF); 
    if ($fa != $fb) return ($fa < $fb ? -1 : +1); 
    // could add a tie-breaker comparison here 
    return 0; 
}); 
+0

這幾乎可以工作,它會返回頂部沒有特色的帖子,並在底部顯示特色的帖子,但排序正確,像這樣:'ab77 bk47 3aa2 13c5 4d55' – 0pc0d3

+0

我正在嘗試去'13c5 4d55 ab77 bk47 3aa2' – 0pc0d3

+0

很奇怪。 [它適用於我。](http://ideone.com/bM3Xq1) –

0

這是我想出了作品凌亂的答案。

$found, $not_found = array(); 

foreach ($posts as $key => $value) { 
    if (array_key_exists($key, $featured)) { 
     $found[$key] = $value; 
    } else { 
     $not_found[$key] = $value; 
    } 
} 

usort($found, 'sort_by_order'); 

function sort_by_order ($a, $b) { 
    return $a['order'] - $b['order']; 
} 

$new = array_merge($found, $not_found); 
相關問題