我有以下结构......
my $categories = { $category => [
{
id => 1,
title => "title1",
sort_order => 1
},
{
id => 13,
title => "title2",
sort_order => 2
},
{
id => 15,
title => "title3",
sort_order => 3
}
] };
有人能告诉我是否有办法根据sort_order对结果进行排序?
答案 0 :(得分:4)
设置一个方法,让sort()使用并从这个
创建一个新数组use strict;
use warnings;
use Data::Dumper;
my $category="wombats";
my $categories = { $category => [
{
id => 1,
title => "title1",
sort_order => 1
},
{
id => 13,
title => "title2",
sort_order => 2
},
{
id => 15,
title => "title3",
sort_order => 3
}
] };
my @sorted = sort { $a->{sort_order} <=> $b->{sort_order} } @{$categories->{$category}};
print "by sort_order\n";
print Dumper(@sorted);
my @sorted2 = sort { $b->{id} <=> $a->{id} } @{$categories->{$category}};
print "by reverse id\n";
print Dumper(@sorted2);
答案 1 :(得分:1)
最简单的方法是使用List::UtilsBy
nsort_by
这是一个例子。我假设您的示例数据中的密钥$category
应为category
use strict;
use warnings 'all';
use List::UtilsBy qw/ nsort_by /;
my $categories = {
category => [
{ id => 1,
title => "title1",
sort_order => 1
},
{ id => 13,
title => "title2",
sort_order => 2
},
{ id => 15,
title => "title3",
sort_order => 3
},
]
};
my $list = $categories->{category};
for my $item ( nsort_by { $_->{sort_order} } @$list ) {
printf "sort order: %d\n", $item->{sort_order};
printf "id: %d\n", $item->{id};
printf "title: %s\n", $item->{title};
print "\n";
}
sort order: 1
id: 1
title: title1
sort order: 2
id: 13
title: title2
sort order: 3
id: 15
title: title3
但是,如果您没有安装模块(它不是核心模块),那么你可以使用基本的Perl这样做,结果相同
for my $item ( sort { $a->{sort_order} <=> $b->{sort_order} } @$list ) {
printf "sort order: %d\n", $item->{sort_order};
printf "id: %d\n", $item->{id};
printf "title: %s\n", $item->{title};
print "\n";
}
答案 2 :(得分:0)
sort
功能允许您通过函数将任意条件应用于排序。
此功能应该依次设置为每个记录的$a
和$b
。它应该返回-1
,0
,+1
(或任何正/负数 - 符号是重要的),具体取决于相对位置。
根据你的筑巢深度,这有点复杂。您可以使用以下方式排序:
sort { $a -> {sort_order} <=> $b -> {sort_order} } @stuff;
将比较这些值并为您提供有序的结果。
要从数据中获取该数组,您需要取消引用。 $category
是您示例中的变量 - 您的意思是使用它吗?无论如何,给你的东西:
@{$categories -> {$category}}
所以:
sort { $a -> {sort_order} <=> $b -> {sort_order} } @{$categories -> {$category}}
您可以在for
循环中使用:
foreach my $thing ( sort { $a -> {sort_order} <=> $b -> {sort_order} } @{$categories -> {$category}} ) {
print $thing -> {title},"\n";
}