2014-09-15 4 views
3

결과를 countryid로 그룹화하려면 아래 데이터를 사용하고 싶습니다.perl 그룹이 fetchrow_hashref를 사용하여 해시 결과를 나타냅니다.

my @test =(); 
my $st = qq[ 
    SELECT id,countryID,abbrev 
    FROM myTable 
]; 
my $q = $data->prepare($st); 
$q->execute() or query_error($st); 
while (my $result = $q->fetchrow_hashref) { 
    push @test, $result; 
} 

나는 아무 문제가

use Data::Dumper; 
print STDERR Dumper(\@test); 

반환

$VAR1 = [ 
    { 'id'  => '1', 
     'countryID' => '1', 
     'title'  => 'Title 1', 
     'abbrev' => 't1' 
    }, 
    { 'id'  => '2', 
     'countryID' => '2', 
     'title'  => 'Title 2', 
     'abbrev' => 't2' 
    }, 
    { 'id'  => '3', 
     'countryID' => '3', 
     'title'  => 'Title 3', 
     'abbrev' => 't3' 
    }, 
    { 'id'  => '4', 
     'countryID' => '1', 
     'title'  => 'Title 4', 
     'abbrev' => 't4' 
    } 
]; 

아래 그림과 같이 내가 국가 그룹에 원하는 결과를 displayling 없었다 fetchrow_hashref 사용.

$VAR1 = [ 
    'countries' => { 
     '1' => [ 
      { 'id'  => '1', 
       'title' => 'Title 1', 
       'abbrev' => 't1' 
      }, 
      { 'id'  => '4', 
       'title' => 'Title 4', 
       'abbrev' => 't4' 
      } 
     ], 
     '2' => [ 
      { 'id'  => '2', 
       'title' => 'Title 2', 
       'abbrev' => 't2' 
      } 
     ], 
     '3' => [ 
      { 'id'  => '3', 
       'title' => 'Title 3', 
       'abbrev' => 't3' 
      } 
     ] 
    } 
]; 

어떻게 이것을 while 루프에서 사용할 수 있습니까?

답변

1

당신은 약간의 (예를 => 대신 = >을 위해),하지만이 완료되면 것으로이 같은 일을해야 위의 구문을 수정해야합니다 훌륭하게.

for (@$VAR1_orig) { 
    my %a = %$_; 
    my $countryID = $a{countryID}; 
    delete $a{countryID}; 
    push @{$VAR1->{countries}{$countryID}}, \%a; 
} 

은 (내가 덧붙여 말하자면, 내 컴퓨터에 노력했다. 그것은 작동합니다.)

은 위의 %$VAR1는 처음에 비어 있다고 가정합니다, 당신은 $VAR1와 함께 할 수있는 후, @$VAR1_orig에 따라 채워 어떤 너는 좋아한다. (난 당신이 %$@$ 펄에서 무엇을 의미하는지 알고 있다고 생각하지만, 아시다시피 이것은 초보자의 주제 없습니다. man 1 perlref를 참조하십시오.)

1

이런 식으로 입력/출력 데이터 구조가 사용자가 가지고 있거나 원하는 데이터 구조가 아닐 수도 있습니다.이를 패치 할 수 있습니다.

use strict; 
use Data::Dumper; 

$a = [ 
    { 'id'  => '1', 
     'countryID' => '1', 
     'title'  => 'Title 1', 
     'abbrev' => 't1' 
    }, 
    { 'id'  => '2', 
     'countryID' => '2', 
     'title'  => 'Title 2', 
     'abbrev' => 't2' 
    }, 
    { 'id'  => '3', 
     'countryID' => '3', 
     'title'  => 'Title 3', 
     'abbrev' => 't3' 
    }, 
    { 'id'  => '4', 
     'countryID' => '1', 
     'title'  => 'Title 4', 
     'abbrev' => 't4' 
    } 
]; 

my $b = {}; 

for my $item (@$a) { 
    if (exists($b->{ $item->{'countryID'} })) { 
     push(@{ $b->{ $item->{'countryID'} } }, $item); 
    } else { 
     $b->{ $item->{'countryID'} } = [$item]; 
    } 
} 
print Dumper($b); 

위의 인쇄 :

$VAR1 = { 
    '1' => [ 
     { 'abbrev' => 't1', 
      'title'  => 'Title 1', 
      'id'  => '1', 
      'countryID' => '1' 
     }, 
     { 'abbrev' => 't4', 
      'title'  => 'Title 4', 
      'id'  => '4', 
      'countryID' => '1' 
     } 
    ], 
    '3' => [ 
     { 'abbrev' => 't3', 
      'title'  => 'Title 3', 
      'id'  => '3', 
      'countryID' => '3' 
     } 
    ], 
    '2' => [ 
     { 'abbrev' => 't2', 
      'title'  => 'Title 2', 
      'id'  => '2', 
      'countryID' => '2' 
     } 
    ] 
}; 
2

샘플 데이터 구조의 오류를 무시, 당신은 기본적으로 변환 찾고 있습니다 해시의 배열의 해시의 해시에 해시의 배열을 형성합니다. 당신이 당신의 초기 데이터 구조 설정을 한 후에는 새 중첩 된 데이터 구조를 생성하기 위해 다음을 수행 할 수 있습니다

for my $href (@test) { 
    my $id = $href->{countryID}; 
    delete $href->{countryID}; 
    push @{ $test2->{countries}{$id} }, $href; 
} 

으로 반복 기본적으로 해시 참조의 배열입니다 배열 @test의 각 요소. 해시에서 countryID 값을 캡처하는 변수 $id을 만듭니다. 해시 참조에서이 해시 참조를 삭제 한 다음 해당 해시 참조를 countries의 첫 번째 레벨이 key이고 두 번째 레벨 키가 $id 인 새로운 중첩 데이터 구조에 해시 참조를 할당합니다.

push 구문을 사용하여 이러한 참조 배열을 만듭니다.

참고 : 설명에 thb으로 명시된 바와 같이 이것은 원래 데이터 구조를 파괴합니다. 원래 구조를 유지하려는 경우에 코드를 수정하여 다음

for my $href (@test) { 
    my $copy = { %$href }; 
    my $id = $copy->{countryID}; 
    delete $copy->{countryID}; 
    push @{ $test2->{countries}{$id} }, $copy; 
} 
+1

당신의 대답은 좋다,하지만 난 작은 말을 만들 것 %의 $의 test2''채우기 외에도, 코드를하지 않습니다 실수로'@ test'를 휴지통에 버렸을까요? 그렇다면 괜찮을 수도 있지만, 아마도 지적해야합니다. – thb

+0

피드백에 감사드립니다. 답변에 귀하의 의견을 추가하고 문제를 피하기위한 대안을 제안했습니다. –