PHP - сортировка элементов массива на основе элементов другого массива :) - PullRequest
4 голосов
/ 07 июля 2010

так что у меня есть два массива.один из них выглядит следующим образом (значения или количество элементов могут меняться):

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

(этот элемент не должен меняться, элементы изначения всегда одинаковы).

обратите внимание, что в первом есть несколько элементов из второго.Как я могу отсортировать 2-й массив на основе элементов из 1-го?

, поэтому в основном, в этом случае 2-й массив должен стать:1-й перемещается вверху в том же порядке, что и 1-й, а остальные остаются одни).

1 Ответ

5 голосов
/ 07 июля 2010

Стабильность была поворотом, поскольку 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...