PHP排序对象值但保留原始相对顺序

时间:2016-11-20 23:39:28

标签: php arrays sorting php-5.3 php-5.5

我使用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按主代码进行排序,但它会混淆原始的相对顺序。

有什么建议吗?

1 个答案:

答案 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]);
            }
        )
    );
}

Example

注意:这适用于PHP 5.5。由于您还标记了PHP 5.3,因此可能需要替换array_column函数。尝试这样的事情:

$sorting = array_unique(array_map(function($row) { return $row[0]; }, $a));