Schrift
[thread]6510[/thread]

Sortieren komplexer Datenstrukturen: wieder mal nicht mehrdimensional



<< >> 7 Einträge, 1 Seite
root
 2004-08-18 22:12
#49374 #49374
User since
2003-08-15
120 Artikel
BenutzerIn
[default_avatar]
Ich habe eine PLZ vom User und ganz viele PLZs und sogar schon Längen- und Breitengrade von Filialen.

Nun nehme ich mir alle Filialen aus der Datenbank und checke für jede wie weit sie vom User entfernt ist. Wenn die Filiale weniger als 100km entfernt ist kommen Ihre Daten in ein Hash. Die Keys vom Hash sind die Eigenschaften der Filiale, Ort, PLZ usw. Ich übergebe das an Flash, darum brauche ich so einen String.

Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    my %spaltennamen = ();
    my $cnt = 0;

    my $statement="SELECT * FROM filialen";
    my $sth = $dbh->prepare($statement) or die("Kann keine Abfrage ($statement) starten:$DBI::errstr");
    $sth->execute;
    my $row;
    while ($row = $sth->fetchrow_hashref)
    {
        my %temp=%$row;
        $temp{'entfernung'} = &entfernung($temp{'bgrad'},$temp{'lgrad'}, $standort{'bgrad'},$standort{'lgrad'});
        if ($temp{'entfernung'} <= $eingang{'umkreis'}){
            foreach my $key (keys %temp){
                  $ausgabe{'data_'.$key} .= $temp{$key}."|";
                  $spaltennamen{$key}++;
            }
        }
        $ausgabe{'error'} = 0;
        $cnt++;
        last if $cnt > 1000;
    }
    $sth->finish;


Ich habe mich irgendwie doch wieder um ein Array mit Hashes als Listenelement rumgemogelt.
Ich brauche aber genau den String um ihn rauszuschreiben. Also habe ich es erstmal so gelassen.

Problem ist nun , ich muss die Daten so ausgeben, dass ich den Ort, mit der geringsten Entfernung als erstes nenne...

Ich habe also ein Hash mit lauter Pipe getrennten Daten.

$ausgabe{'name'} = "name1|name2|name3";
$ausgabe{'entfernung'} = "3|1|2";
$ausgabe{'...

Das soll nun nach der Entfernung sortiert werden. So dass ich dann
$ausgabe{'name'} = "name2|name3|name1";
$ausgabe{'entfernung'} = "1|2|3";
$ausgabe{'...

HILFE!!!\n\n

<!--EDIT|root|1092852917-->
Ishka
 2004-08-18 22:18
#49375 #49375
User since
2003-08-04
771 Artikel
HausmeisterIn
[Homepage] [default_avatar]
@array = sort {beliebiger code mit komplexer sortierroutine} @array;

in $a und $b stehen die zu vergleichenden Elemente, der Code sollte -1, 0 oder 1 zurückgeben. Darin kannst du beliegib komplexe Vergleiche machen.
sub z{if(@_){1while$x[$k=rand 10];t($t=$x[$k]=1)}print map"$z[$x[$_]]$_".($_%3?
"":"\n"),1..9}sub t{$j=0;$x[$_+1]==$t&&($j+=2**$_)for 0..8;z,die"Gewinner $z[$t]
"if grep$_==($j&$_),7,56,73,84,146,273,292,448;z,die"Gleichstand\n"if@x>9&&!grep
!$_,@x}@x=4;@z=qw{. [ (};z$^T&1;while(<>){next if$_>9||$x[$_];t$t=$x[$_]=2;z 1}
root
 2004-08-18 22:25
#49376 #49376
User since
2003-08-15
120 Artikel
BenutzerIn
[default_avatar]
Aber ich habe doch kein Array!

Oder ich habe sogar 9 Arrays die ich nach der Reihenfolge umgestellt werden müssen wie eines diese Arrays...
renee
 2004-08-18 22:31
#49377 #49377
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Kannst Du doch so machen:
Code: (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
    my %spaltennamen = ();
my @filialen;
my $cnt = 0;

my $statement="SELECT * FROM filialen";
my $sth = $dbh->prepare($statement) or die("Kann keine Abfrage ($statement) starten:$DBI::errstr");
$sth->execute;
#print "$statement ==> $DBI::errstr<br>\n";
my $row;
while ($row = $sth->fetchrow_hashref)
{
my %temp=%$row;
$temp{'entfernung'} = &entfernung($temp{'bgrad'},$temp{'lgrad'}, $standort{'bgrad'},$standort{'lgrad'});
if ($temp{'entfernung'} <= $eingang{'umkreis'}){
foreach my $key (keys %temp){
push(@filialen,\%temp);
$spaltennamen{$key}++;
}
}
$ausgabe{'error'} = 0;
$cnt++;
last if $cnt > 1000;
}
$sth->finish;

@filialen = sort{$a->{entfernung} <=> $b->{entfernung}}@filialen;
my %ergebnis;
foreach my $key(keys(%{$filialen[0]})){
$ergebnis{$key} = join('|',map{$_->{$key}}@filialen);
}
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
renee
 2004-08-18 22:34
#49378 #49378
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Ich habe zum Testen von sortieren und join folgenden Code verwendet:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#! c:/wampp1/perl/bin/perl

use strict;
use warnings;
use Data::Dumper;

my @array = ({name => 'test',entfernung => '43'},
{name => 'person', entfernung => '2'},
{name => 'dsss', entfernung => '6'});

my %hash;

@array = sort{$a->{entfernung} <=> $b->{entfernung}}@array;

foreach my $fil(keys(%{$array[0]})){
$hash{$fil} = join('|',map{$_->{$fil}}@array);
}

print Dumper(\%hash);


und folgende Ausgabe erhalten:
Quote
C:\wampp1\perl\bin>perl c:\tester.pl
$VAR1 = {
'entfernung' => '2|6|43',
'name' => 'person|dsss|test'
};
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
Crian
 2004-08-18 22:54
#49379 #49379
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
[quote=root,18.08.2004, 20:25]Aber ich habe doch kein Array!

Oder ich habe sogar 9 Arrays die ich nach der Reihenfolge umgestellt werden müssen wie eines diese Arrays...[/quote]
doch

Wenn Du ein Hash hast, bilden dessen Schlüssel natürlich auch ein Array.

Also

Code: (dl )
1
2
3
4
my %hash = ...;
for (sort {...} keys %hash) {
...
}
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
root
 2004-08-19 15:03
#49380 #49380
User since
2003-08-15
120 Artikel
BenutzerIn
[default_avatar]
Ja oberfett! Was ein Support! Copy and Paste und fast feddisch!!!
Vielen Dank!

Alleine wäre ich im leben nicht darauf gekommen!
<< >> 7 Einträge, 1 Seite



View all threads created 2004-08-18 22:12.