2010-07-07 191 views
4

所以我有兩個數組。其中一個看起來是這樣的(它的值或元素的數量可以改變):PHP - 基於另一個數組的元素排序數組元素:)

array('4dec' , 'def3', 'a3d6', 'd12f'); 

另:

array(array('id' => 'd12f', 'name' => 'John'), 
     array('id' => 'a5f1', 'name' => 'Kathy'), 
     array('id' => 'def3', 'name' => 'Jane'), 
     array('id' => 'a3d6', 'name' => 'Amy'), 
     array('id' => '4dec', 'name' => 'Mary'),  
     array('id' => 'ecc2', 'name' => 'Fred')); 

(這不應該改變,要素和值是相同的每次)。

注意第一個有第二個元素。 如何根據第一個元素排序第二個數組?

所以基本上,在這種情況下,第二陣列應該成爲:

array(array('id' => '4dec', 'name' => 'Mary'), 
     array('id' => 'def3', 'name' => 'Jane'), 
     array('id' => 'a3d6', 'name' => 'Amy'), 
     array('id' => 'd12f', 'name' => 'John'), 
     array('id' => 'a5f1', 'name' => 'Kathy'), 
     array('id' => 'ecc2', 'name' => 'Fred')); 

(存在於第一一個的元素在頂部移動時,以相同的順序爲第1,而其它是留下一個)。

+0

是否總是隻有數據數組的「id」和「name」屬性?如果是這樣,我們可以放棄這些顯式鍵名,並將第一個數組作爲第二個索引,而不需要排序。 – 2010-07-07 18:41:22

回答

4

穩定性是一個轉折點,因爲PHP不再重視這一點,但有一點額外的工作可以保持穩定。

$order_by = array('4dec' , 'def3', 'a3d6', 'd12f'); 

$data = array(array('id' => 'd12f', 'name' => 'John'), 
       array('id' => 'a5f1', 'name' => 'Kathy'), 
       array('id' => 'def3', 'name' => 'Jane'), 
       array('id' => 'a3d6', 'name' => 'Amy'), 
       array('id' => '4dec', 'name' => 'Mary'),  
       array('id' => 'ecc2', 'name' => 'Fred')); 

// create a lookup table for sorted order to avoid repeated searches 
$order_index = array_flip($order_by); 

// create a lookup table for original order: in PHP 4.1.0 usort became unstable 
// http://www.php.net/manual/en/function.usort.php 
$orig_order_by = array_map(function($a){return $a['id'];}, $data); 
$orig_index = array_flip($orig_order_by); 

// sort values by specified order, with stability 
$compare = function($a, $b) use (&$order_index, &$orig_index) { 
    $aid = $a['id']; 
    $bid = $b['id']; 

    $ai = $order_index[$aid]; 
    $bi = $order_index[$bid]; 

    if ($ai === null and $bi === null) { // original sort order for stability 
     return $orig_index[$aid] - $orig_index[$bid]; 
    } 
    if ($ai === null) { return 1; } 
    if ($bi === null) { return -1; } 

    return $ai - $bi; 
}; 
usort($data, $compare); 
var_dump($data); 
相關問題