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

PHP排序对象值,但保留原始相对顺序,php,arrays,sorting,php-5.3,php-5.5,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_代码值对数组进行排序,但不影响顺序 即,最终顺序应为: MASTER_CODE

我使用usort对对象数组进行排序,但实际上我希望它可以作为一种“分组依据”函数,而不会干扰行的原始相对顺序

假设我有这个:

MASTER_CODE, CONFIG_ITEM
foo1, opt_ray
foo2, opt_ray
foo1, opt_fah
foo2, opt_doe
根据这些数据,使用匿名密钥构造一个对象数组。也就是说,每一行都被解析为一个对象。对象被收集到一个数组中

我想做的是按照MASTER_代码值对数组进行排序,但不影响顺序

即,最终顺序应为:

MASTER_CODE, CONFIG_ITEM
foo1, opt_ray
foo1, opt_fah
foo2, opt_ray
foo2, opt_doe
我们不添加排序顺序,因为数据来自外部源

我可以使用usort按主代码排序,但它会打乱原始的相对顺序


有什么建议吗?

这是一种选择-它不是最优雅的解决方案。它将从数组的第一列(您要筛选的列)中获取唯一的值,对其进行排序,然后循环它,并从原始数组中添加具有相同第一个值的条目

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

注意:这将在PHP5.5上工作。由于还标记了PHP5.3,因此可能需要替换
array\u列
函数。试着这样做:

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

这是一个很好的想法,但重要的是要记住,这是一个对象数组,而不是数组数组。每一行数据都被解析为一个对象。这些对象被累积到一个数组中。确定。你能发布一个实际对象的
var\u导出
,这样我可以再看一眼吗?不幸的是,我不能给你一个导出作为它的敏感数据。对。好吧,你可以做点黑客,嗯。。。在加载/解析期间,我可以向对象添加sortorder参数。这会将原始顺序嵌入到对象中,我可以将其包含在我的usort中…可能是