我有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)
);
我想:
结果应如下所示:
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(),但无论我在某些时候做什么,数据都会被覆盖(因为数组键是字符串),结果并不完整。
任何想法如何以聪明的方式做到这一点?
答案 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
现在正是我想要的。