我有一个循环遍历一堆项目的函数,每个项目看起来像这样:
[
{"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}
答案 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
创建一个显示所需列顺序的新数组。
$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);
});
所以我们通过比较索引的差异进行排序。