Thread Größten Wert in mehrstufigem Hash finden (20 answers)
Opened by Stefan_S at 2018-03-15 09:46

Linuxer
 2018-03-15 19:44
#188166 #188166
User since
2006-01-27
3872 Artikel
HausmeisterIn

user image
Quote
...wenn du die Daten aus dem Hash erst in ein Array schreibst und dann sortierst, kann ich doch auch gleich ein Array aus der Datenbank erstellen, oder?


Genau das ist der Punkt. Die gewählte Datenstruktur ist ungünstig.

Wie hlubenow in Größten Wert in mehrstufigem Hash finden schrieb:

hlubenow
Das ist eben gerade nicht Dein eigentliches Problem.
Sondern Dein Problem ist eine schlechte und unnötig komplizierte Datenstruktur. Mit der dann auch unnötig schwer umzugehen ist.


Überlege Dir vorher, was genau Du mit den Daten vorhast und richte Dir dann auf der Basis die Datenstruktur ein. Möglichkeiten dafür gibt es verschiedene. Du musst nur eine passende für Deinen Einsatz finden ;-)

Anstatt:
Code (perl): (dl )
1
2
3
4
5
$tc_artikel{$tc_timestamp}->{$tc_artikel_id}->{$tc_charge_id} = {
        artikel_nr      => $tc_artikel_nr,
        bestand         => $tc_chargenbestand,
        charge          => $tc_charge,
}


könnte man beispielsweise so eine Struktur aufbauen:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
my $separator = "x";

my $artikel_charge = $tc_artikel_id . $separator, $tc_charge_id;

push @{ $tc_artikel { $artikel_charge } }, {
        artikel_nr      => $tc_artikel_nr,
        bestand         => $tc_chargenbestand,
        charge          => $tc_charge,
};


Damit solltest Du einen Hash-Of-Arrays erhalten:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
'2111x10' => [
    {
        'artikel_nr' => 'AGI15030',
        'bestand' => '3120.00',
        'charge' => 'RSG'
    },
    {
        'artikel_nr' => 'AGI15030',
        'bestand' => '3150.00',
        'charge' => 'RSG'
    },
    {
        'artikel_nr' => 'AGI15030',
        'bestand' => '3110.00',
        'charge' => 'RSG'
    },
],

'2111x3' => [
        {
          'artikel_nr' => 'AGI15030',
          'bestand' => '1450.00',
          'charge' => 'Event Management'
        },
        {
            'artikel_nr' => 'AGI15030',
            'bestand' => '1100.00',
            'charge' => 'Event Management'
        },

],



Beispiel:
more (10.1kb):

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#! /usr/bin/env perl
use strict;
use warnings;
use 5.010;
use Data::Dumper;


my %tc_artikel = (
    '2111x10' => [
        {
            'artikel_nr' => 'AGI15030',
            'bestand'    => '3120.00',
            'charge'     => 'RSG'
        },
        {
            'artikel_nr' => 'AGI15030',
            'bestand'    => '3150.00',
            'charge'     => 'RSG'
        },
        {
            'artikel_nr' => 'AGI15030',
            'bestand'    => '3110.00',
            'charge'     => 'RSG'
        },
    ],

    '2111x3' => [
        {
            'artikel_nr' => 'AGI15030',
            'bestand'    => '1450.00',
            'charge'     => 'Event Management'
        },
        {
            'artikel_nr' => 'AGI15030',
            'bestand'    => '1100.00',
            'charge'     => 'Event Management'
        },
    ],
);


# zeige den jeweils hoechsten Bestand an:
for my $artikel_charge ( keys %tc_artikel ) {

    my $max = ( sort { $b->{bestand} <=> $a->{bestand} } @{ $tc_artikel{ $artikel_charge } } )[0];

    # split wenn man artikel und charge id wieder separat braucht
    #my ( $art_id, $chg_id ) = split m{x}, $artikel_charge;

    say $artikel_charge, "\n",
        Dumper( $max );


}

__END__


Last edited: 2018-03-15 19:45:24 +0100 (CET)
meine Beiträge: I.d.R. alle Angaben ohne Gewähr und auf Linux abgestimmt!
Die Sprache heisst Perl, nicht PERL. - Bitte Crossposts als solche kenntlich machen!

View full thread Größten Wert in mehrstufigem Hash finden