duskwuff already explains in their answer。私の答えはそれに基づいています。
代わりに、配列の配列があり、各内部配列にオブジェクトのペアがあるとします。私は説明するためにMooクラスを作成しました。
package My::Model::Group;
use Moo;
has [qw/id name/] => (is => 'ro');
package My::Model::Group::Admin;
use Moo;
has [qw/id name/] => (is => 'ro');
package main;
my $groups = [
[
My::Model::Group->new(id => 1, name => 'group1') =>
My::Model::Group::Admin->new(id => 1, name => 'foo')
],
[
My::Model::Group->new(id => 2, name => 'group2') =>
My::Model::Group::Admin->new(id => 1, name => 'foo')
],
[
My::Model::Group->new(id => 3, name => 'group3') =>
My::Model::Group::Admin->new(id => 1, name => 'bar')
],
[
My::Model::Group->new(id => 4, name => 'group4') =>
My::Model::Group::Admin->new(id => 1, name => 'foo')
],
];
4つのペアがあります。 2人の管理者、4人のグループ。グループのうちの3つはfoo adminに属し、1つはbarに属します。テンプレートを見てみましょう。
use Template;
my $tt = Template->new();
$tt->process(\*DATA, { groups => $groups }, \my $output)
or die $tt->error;
print $output;
__DATA__
[%- FOREACH item IN groups -%]
[%- DEFAULT by_admin.${item.1.name} = [] -%]
[%- by_admin.${item.1.name}.push(item.0) -%]
[%- END -%]
[%- FOREACH admin IN by_admin.keys.sort -%]
[%- FOREACH group IN by_admin.$admin -%]
[%- admin %] -> [% group.id %]
[%- END -%]
[%- END -%]
明らかに、該当する部分はDATA
セクションです。アレイデータ構造を管理者を持つハッシュに再編成し、各グループを管理スロットの1つにソートする必要があります。
変数by_admin
を作成する必要はありません。暗黙的にグローバルに作成されます。しかし、私たちは$by_admin->{$item[0]->name}
のデフォルト値を設定する必要があります(わかりやすくするためにPerl構文を使用しています)。 Template Toolkitはautovivificationを知らず、the DEFAULT
keywordは//=
assignment operator in Perlと似ています。
我々はby_name
内部キーitem.1.name
とハッシュリファレンス要素内先ほど作成した配列リファレンスへitem
のその後push
最初の要素(それはまだ存在していなかった場合)することができます。
準備が整ったら、残りは単純なループにすぎません。 sort
edkeys
をby_admin
に反復し、そのキーの後ろにある配列refを反復処理します。しかし、あなたのコントローラでは代わりに、これは、テンプレートにない前処理を行うには理にかなって
bar -> 3
foo -> 1
foo -> 2
foo -> 4
:
は、ここでの出力です。通常のPerlコードでは、読みやすくする必要があります。私は簡潔にするためuse strict
とuse warnings
を省略している
my %by_admin;
for my $group (@$groups) {
push @{ $by_admin{ $group->[1]{name} } }, $group->[0];
}
注意。
FOREACH item IN listは正しいです。しかし、あなたはそれらを再編成したいのですか?これはExcelのピボットのようなものです。あなたは '{1 => 'foo'、2 => 'bar'、3 => 'foo'}'のようなものを持っていて、 'foo'は' 1,3 'を、 'bar'は' 2 '。私は理解しましたか? – simbabque
はい、そうです。あなたはそれが絶対に正しいことを得た – Albert
複数の管理者がいますか?私はまだ期待される出力を理解していない。 – simbabque