加入数组数组

时间:2015-07-27 18:08:17

标签: arrays perl perl5 arrayref

我有一个未知大小的数组SELECT CUST.CustomerID, CUST.Name, ORDR.OrderID, ORDR.OrderDate, ORDR.ProductInfo, COUNTS.cnt FROM Customers CUST INNER JOIN Orders ORDR ON ORDR.CustomerID = CUST.CustomerID INNER JOIN ( SELECT C.CustomerID, COUNT(DISTINCT O.OrderID) AS cnt FROM Customers C INNER JOIN Orders O ON O.CustomerID = C.CustomerID GROUP BY C.CustomerID ) COUNTS ON COUNTS.CustomerID = CUST.CustomerID ORDER BY COUNTS.cnt DESC, CustomerID 。每个元素@ary都是未知大小的arrayref。 的每个元素$ary[$i]都是一个字符串。

我希望将$ary[$i][$j]与所有$ary[0][$j]的所有内容连接起来......等等。

也就是说,假设我的数组看起来像这样:

$ary[1][$j]

然后我希望$ary[0] = ['foo', 'fun']; $ary[1] = ['bar', 'bun', 'blip']; $ary[2] = ['baz', 'zun']; 成为:

return

(或者,( 'foo bar baz', 'foo bar zun', 'foo bun baz', 'foo bun zun', 'foo blip baz', 'foo blip zun', 'fun bar baz', 'fun bar zun', 'fun bun baz', 'fun bun zun', 'fun blip baz', 'fun blip zun' ) 可以是arrayrefs数组:return。)

我该怎么做?

2 个答案:

答案 0 :(得分:3)

我建议从一系列索引开始,然后遍历所有组合:

#!/usr/bin/env perl

use strict;
use warnings;
use feature qw(say);

my @array = (
    [qw(foo fun)],
    [qw(bar bun blip)],
    [qw(baz zun)],
);

my @index = (0) x @array;

SET:
while (1) {
    my @set = map { $array[$_][ $index[$_] ] } (0 .. $#index);

    say "@set";

    $index[-1]++;

    for my $i (reverse 0 .. $#index) {
        if ($index[$i] > $#{ $array[$i] }) {
            $index[$i] = 0;
            if ($i > 0) {
                $index[$i - 1]++;
            } else {
                last SET;
            }
        }
    }
}

结果:

foo bar baz
foo bar zun
foo bun baz
foo bun zun
foo blip baz
foo blip zun
fun bar baz
fun bar zun
fun bun baz
fun bun zun
fun blip baz
fun blip zun

有cpan模块可以做这种组合,但不能随时了解它们。

答案 1 :(得分:1)

我做到了这一点并且有效:

#!/usr/bin/perl
use strict;
use warnings;

my @arry= ();
$arry[0] = ['foo', 'fun'];
$arry[1] = ['bar', 'bun', 'blip'];
$arry[2] = ['baz', 'zun'];

my @combos = ();
$combos[0] = [''];

for my $i (1 .. @arry) {
  for my $j (0 .. @{$combos[$i - 1]} - 1) {
    push @{$combos[$i]}, "$combos[$i - 1][$j] $_" for @{$arry[$i - 1]};
  }
}
my @goodcombos = @{$combos[-1]};
s/^ // for @goodcombos;
print "$_\n" for @goodcombos;

它构建了所需的连接,存储了$combos[1]中的第一个术语,$combos[2]中前两个术语的连接,$combos[3]中前三个术语的连接,以及等等。