我使用usort对一组对象进行排序,但实际上我希望这可以作为一种"组来实现"功能不会干扰行的原始相对顺序。
说我有这个:
MASTER_CODE, CONFIG_ITEM
foo1, opt_ray
foo2, opt_ray
foo1, opt_fah
foo2, opt_doe
从该数据中,使用匿名密钥构造对象数组。也就是说,每行都被解析为一个对象。对象被收集到一个数组中。
我想要做的是按MASTER_CODE值对数组进行排序,但不会打扰顺序。
也就是说,最终的顺序应该是:
MASTER_CODE, CONFIG_ITEM
foo1, opt_ray
foo1, opt_fah
foo2, opt_ray
foo2, opt_doe
我们不会添加排序顺序,因为数据来自外部来源。
我可以使用usort按主代码进行排序,但它会混淆原始的相对顺序。
有什么建议吗?
答案 0 :(得分:0)
这是一个选择 - 它不是最优雅的解决方案。它将从数组的第一列(您要过滤的那一列)中获取唯一值,对其进行排序,然后循环它并使用相同的第一个值从原始数组中添加条目。
// Get an unique array of values to use for sorting
$sorting = array_unique(array_column($a, 0));
sort($sorting);
$sorted = [];
foreach ($sorting as $sortValue) {
$sorted = array_merge(
$sorted,
array_filter(
$a,
function($row) use ($sortValue) {
// Find values that have the same first value as each sort value
return ($sortValue === $row[0]);
}
)
);
}
注意:这适用于PHP 5.5。由于您还标记了PHP 5.3,因此可能需要替换array_column
函数。尝试这样的事情:
$sorting = array_unique(array_map(function($row) { return $row[0]; }, $a));