2010-07-07 8 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-ый перемещаются в верхней части, в том же порядке, что и 1, а остальные оставлено в покое).

+0

Всегда ли существуют свойства 'id' и 'name' для массива данных? Если это так, мы можем отбросить эти явные имена ключей и использовать первый массив как индекс ко второму, без необходимости сортировки. –

ответ

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);