【问题标题】:PHP - Sort array elements based on another array's elements :)PHP - 根据另一个数组的元素对数组元素进行排序:)
【发布时间】:2010-07-07 18:11:34
【问题描述】:

所以我有两个数组。其中一个看起来像这样(它的值或元素的数量可以改变):

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

(第一个中存在的元素移到顶部,与第一个相同的顺序,其余的保持不变)。

【问题讨论】:

  • 数据数组是否总是只有“id”和“name”属性?如果是这样,我们可以丢弃这些显式键名并使用第一个数组作为第二个数组的索引,而无需排序。

标签: php arrays sorting


【解决方案1】:

稳定性是一个转折点,因为 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);

【讨论】:

    猜你喜欢
    • 2012-08-11
    • 1970-01-01
    • 2018-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-30
    • 1970-01-01
    相关资源
    最近更新 更多