在PHP中任意对数组中的对象进行排序

时间:2018-04-12 20:29:54

标签: php sorting

我有一个循环遍历一堆项目的函数,每个项目看起来像这样:

[
{"Target":"col-one","Value":0.261},
{"Target":"col-two","Value":0.881},
{"Target":"col-three","Value":0.571},
{"Target":"col-four","Value":0}
]

我想重新订购每件商品,以便不是按升序排列,而是像col-one,col-four,col-three,col-two。是否有一种相对简单的方法可以完成这种任意排序?

要清楚,我希望结果如下所示:

[
     {"Target":"col-one","Value":0.261}, 
     {"Target":"col-four","Value":0}, 
     {"Target":"col-three","Value":0.571}, 
     {"Target":"col-two","Value":0.881}

3 个答案:

答案 0 :(得分:2)

如果您有一个定义排序顺序的数组,例如:

$order = ['col-one', 'col-four', 'col-three', 'col-two'];

您可以将其传递到usort比较函数并在那里查找排序索引。我认为如果翻转它会使文本成为关键,这会更容易。

$order = array_flip($order);

usort($items, function($a, $b) use ($order) {
    return $order[$a->Target] <=> $order[$b->Target];
});

如果您不先将其翻转,则必须反复array_search。 (除非有一种我不知道的更好的方法。)

usort($items, function($a, $b) use ($order) {
    return array_search($a->Target, $order) <=> array_search($b->Target, $order);
});

答案 1 :(得分:1)

我想我理解你的问题,你想按照你想要的任何顺序对数组进行排序。您可以使用array_map

$json='[
{"Target":"col-one","Value":0.261},
{"Target":"col-two","Value":0.881},
{"Target":"col-three","Value":0.571},
{"Target":"col-four","Value":0}
]';

$order_to_sort=array('col-four','col-one','col-three','col-two');
$arr=json_decode($json);

function sortObjects($arr,$order_to_sort){
return array_map(function ($a)use($arr) { return array_filter($arr, function($elem) use($a){
    return $elem->Target === $a;
}); }, $order_to_sort);
}
echo "<pre>";
print_r(sortObjects($arr,$order_to_sort));

答案 2 :(得分:0)

两种方法:使用自定义回调函数usort http://php.net/manual/en/function.usort.php对数组进行排序,或者编写仅包含列的数组,然后将array_map写入新数组:http://php.net/manual/en/function.array-map.php

usort

创建一个显示所需列顺序的新数组。

$columns = ['col-four', 'col-two', 'col-three', 'col-one'];

应用排序函数,将两个列名称与索引进行比较:

usort($targets, function ($a, $b) use ($columns) {
    return array_search($a->Target], $columns) - array_search($b->Target], $columns);
});

所以我们通过比较索引的差异进行排序。