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


Merging arrays, grouping and sorting the values

我有 2 个数组,其中 3 组的项目被混合在一起。数组的关键键是:group_iditem_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. group_id升序排序
  3. 最后,按item_order升序对每个组进行排序

结果应如下所示:

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(),但无论我在某些时候做什么,数据都会被覆盖(因为数组键是字符串),结果并不完整。

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

您可以使用茴香酒库轻松完成此操作。

合并数组:

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

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

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

分组(茴香酒好东西来玩):

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

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

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

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

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

(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现在正是我想要的。