我有 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)
);
我想:
- 合并两个数组,以便按group_id对结果进行分组
- 按group_id升序排序
- 最后,按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
现在正是我想要的。