合并数组,对值进行分组和排序

时间:2015-01-11 20:36:14

标签: php arrays sorting multidimensional-array

我有2个阵列,其中3组中的项目混合在一起。数组的关键键是: group_id item_order

$one = array(
            array('group_id' => 1, 'name' => 'Luke', 'item_order' => 0),
            array('group_id' => 2, 'name' => 'Vader', 'item_order' => 1),
            array('group_id' => 1, 'name' => 'Han', 'item_order' => 1)
        );

$two = array(
            array('group_id' => 3, 'name' => 'Jabba', 'item_order' => 1),
            array('group_id' => 3, 'name' => 'Palpatine', 'item_order' => 0),
            array('group_id' => 2, 'name' => 'Bib Fortuna', 'item_order' => 0)
        );

我想:

  1. 合并两个数组,因此结果按 group_id
  2. 分组
  3. group_id 升序排序
  4. 最后,按 item_order 升序
  5. 对每个组进行排序

    结果应如下所示:

    array(
        ['group_1'] => array(
                    array('group_id' => 1, 'name' => 'Luke', 'item_order' => 0),
                    array('group_id' => 1, 'name' => 'Han', 'item_order' => 1)
                );
        ['group_2'] => array(
                    array('group_id' => 2, 'name' => 'Palpatine', 'item_order' => 0),
                    array('group_id' => 2, 'name' => 'Vader', 'item_order' => 1)
                );
        ['group_3'] => array(
                    array('group_id' => 3, 'name' => 'Bib Fortuna', 'item_order' => 0),
                    array('group_id' => 3, 'name' => 'Jabba', 'item_order' => 1)
                );
        );
    

    我尝试array_merge(),但无论我在某些时候做什么,数据都会被覆盖(因为数组键是字符串),结果并不完整。

    任何想法如何以聪明的方式做到这一点?

2 个答案:

答案 0 :(得分:3)

您可以使用Ouzo Goodies库轻松完成。

合并你的数组:

$array = array_merge($one, $two);

按item_order排序(这样变得更容易):

usort($array, function($a, $b) {
    return $a['item_order'] > $b['item_order'] ? 1 : -1;
});

分组(Ouzo Goodies来玩):

$result = Arrays::groupBy($array, function($element) {
    return $element['group_id'];
});

由于您希望密钥为group_number格式,我们需要更改它们:

$result = Arrays::mapKeys($result, function($key) {
    return 'group_' . $key;
});

这应该可以解决问题。如果您不想在堆栈中添加新的lib,可以查看源代码并将这些函数放到代码库中(MIT许可证)。

答案 1 :(得分:0)

不确定以下是否是最佳解决方案,但它确实有效。

(1)创建临时数组:

$one_tmp = array();
$two_tmp = array();

(2)根据行的 group_id 包装字符串类型键中的每一行,以便以后合并这些组:

for ($i = 0; $i < count($one); $i++) {
    $group_id = $one[$i]['group_id'];
    $one_tmp['group_'.$group_id][$i] = $one[$i];
}

for ($i = 0; $i < count($two); $i++) {
    $group_id = $two[$i]['group_id'];
    $two_tmp['group_'.$group_id][$i] = $two[$i];
}

(3)递归地合并分组的临时数组:

$merged = array_merge_recursive($drugs_tmp, $subdrugs_tmp);

(4)按点(2)中创建的组密钥排序:

ksort($merged, SORT_NATURAL);

(5)按 item_order

对每个组进行排序
foreach ($merged as $key => $value) {
    usort($merged[$key], 'compare_item_order');
}

function compare_item_order($a, $b) {
    return $a['item_order'] - $b['item_order'];
}

瞧! $merged现在正是我想要的。