2010-07-07 193 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); 
相关问题