Avatar billede jfl Nybegynder
13. juni 2003 - 01:07 Der er 17 kommentarer og
1 løsning

Match 2 arrays, og find nøgler ud fra kriterier

Jeg ønsker en funktion som for hver nøgle i end:Array kan finde den nøgle fra start:Array, som har den højeste værdi og som er lavere end den pågældende fra end:Array.

start:Array
(
    [0] => 5
    [1] => 64
    [2] => 150
    [3] => 236
    [4] => 297
)

end:Array
(
    [0] => 132
    [1] => 218
    [2] => 362
    [3] => 380
    [4] => 397
)

Min hjerne er ved at koge over, så jeg har brug for jeres hjælp :)
Avatar billede jfl Nybegynder
13. juni 2003 - 01:14 #1
Dvs:

KeyEnd  KeyStart
0      1
1      2
2      3
3      4
4      0

Man skal nok fjerne rækken fra start:Array når man finder den rette, for at opnå ovenstående. Og gå gennem end:Array først.
Avatar billede jfl Nybegynder
13. juni 2003 - 01:16 #2
Det skal bruges til at finde positioner på de tags der hører sammen. F.eks:

<start>
<start></slut>
<start></slut>
<start>
  <start></slut>
</slut>
</slut>
Avatar billede tipsen Nybegynder
13. juni 2003 - 01:30 #3
Dine arrays er altid sorteret, så værdierne er stigende og antal elementer er ens?
Avatar billede tipsen Nybegynder
13. juni 2003 - 01:45 #4
Jeg går udfra dit eksempel er forkert - ellers har jeg misforstået dig!

Ikke pænt - men det fungerer vist:

$start=Array(5,64,150,236,297);
$end=Array(132,218,362,380,397);

foreach ($end as $key => $val) {
  foreach($start as $key2 => $val2) {
      if ($val2 >= $val) {
        break;
      }
  }
  $key2--;
  echo "$key => $key2<br>";
}
Avatar billede skovenborg Nybegynder
13. juni 2003 - 02:08 #5
Lidt i samme stil med tipsen's, men mere som jeg har opfattet dit spørgsmål:
<?php
$start=Array(5,64,150,236,297);
rsort($start);
$end=Array(132,218,362,380,397);
foreach ($end as $key => $value)
{
    foreach ($start as $key2 => $value2)
    {
        if ($value2 <= $value)
                {
                    echo "<br>$key >= $key2";
                    continue 2;
                }
        }
}
?>
Avatar billede jfl Nybegynder
13. juni 2003 - 10:43 #6
tipsen: ja, mine arrays er altid sorteret, og der vil altid være lige mange <start> og </slut>, men forskelligt antal ialt.

tipsen's resultat:
0 => 1
1 => 2
2 => 3
3 => 3
4 => 3

skovenborg's resultat:
0 >= 3
1 >= 2
2 >= 0
3 >= 0
4 >= 0

Begge er forkert. Det skal være som jeg skrev (13/06-2003 01:14:59), f.eks:

<start 0>
  <start 1></slut 1>
  <start 2></slut 2>
  <start 3>
    <start 4></slut 4>
  </slut 3>
</slut 0>

Tallene er nøgler.
Avatar billede andy Nybegynder
13. juni 2003 - 11:37 #7
<?php
$start=Array(5,64,150,236,297);
$end=Array(132,218,362,380,397);
foreach ($end as $key => $val) {
    $a = 0;
    foreach($start as $key2 => $val2) {
        if ($val2 < $val) { $a = $key2; }
    }
    echo "$key => $a<br>";
}
?>
printer:
0 => 1
1 => 2
2 => 4
3 => 4
4 => 4

Hvilket også passer på "Jeg ønsker en funktion som for hver nøgle i end:Array kan finde den nøgle fra start:Array, som har den højeste værdi og som er lavere end den pågældende fra end:Array."
Avatar billede jfl Nybegynder
13. juni 2003 - 12:02 #8
andy: Det er heller ikke korrekt.

Så ville start tag 2, 3 og 4 alle have slut tag 4, hvilket jo ikke er rigtigt.
Avatar billede fri-hash Nybegynder
13. juni 2003 - 12:05 #9
men når du skriver "den højeste værdi fra start som er lavere end den aktuelle fra end, så passer startindex 3 da ikke til endindex 2, da endindex 2 er 362, vil startindex 4 (297) være det højeste, der er mindre end 362

eller er det bare mig der har stirret mig blind?
Avatar billede tipsen Nybegynder
13. juni 2003 - 12:27 #10
jfl: Sådan som jeg forstår din forklaring:

"Jeg ønsker en funktion som for hver nøgle i end:Array kan finde den nøgle fra start:Array, som har den højeste værdi og som er lavere end den pågældende fra end:Array."

Passer min løsning! (Bemærk at index starter i 0!)

$start=Array(5,64,150,236,297);
$end=Array(132,218,362,380,397);

0 => 1 (nøgle 0 i end har værdi 132 - hvilket modsvares af værdien 64 fra start med nøgle 1)
1 => 2(nøgle 1 i end har værdi 218 - hvilket modsvares af værdien 150 fra start med nøgle 2)
2 => 3 (nøgle 2 i end har værdi 362 - hvilket modsvares af værdien 297 fra start med nøgle 3)
3 => 3 (nøgle 3 i end har værdi 380 - hvilket modsvares af værdien 297 fra start med nøgle 3)
4 => 3 (nøgle 3 i end har værdi 397 - hvilket modsvares af værdien 297 fra start med nøgle 3)

Det matcher din forklaring - så hvis det er forkert må du revidere din forklaring og prøve igen!
Avatar billede andy Nybegynder
13. juni 2003 - 12:34 #11
tipsen, nøgle 3 i start er da 236?
Avatar billede tipsen Nybegynder
13. juni 2003 - 12:54 #12
andy - korrekt - bug i programmet - den burde give:

0 => 1
1 => 2
2 => 4
3 => 4
4 => 4

udfra forklaringen - dvs. det samme som du har - der kommer selvfølgelig et kiks, når sammenligningen køres på sidste felt - følgende er bedre:

$start=Array(5,64,150,236,297);
$end=Array(132,218,362,380,397);

foreach ($end as $key => $val) {
  foreach($start as $key2 => $val2) {
      if ($val2 >= $val) {
        $key2--;
        break;
      }
  }
  echo "$key => $key2<br>";
}
Avatar billede andy Nybegynder
13. juni 2003 - 14:13 #13
I see. :)

Jeg tror der er et eller andet jlf har glemt at nævne...
Avatar billede jfl Nybegynder
14. juni 2003 - 01:11 #14
Der er ingen tvivl om at jeg har beskrevet det forkert og lavet fejl.
Glem alt hvad jeg tidligere har skrevet.

Det jeg ønsker er at finde ud af hvilket start tag der hører til hvilket slut tag.

<start key=0 pos=5>
  <start key=1 pos=64></slut key=0 pos=132>
  <start key=2 pos=150></slut key=1 pos=218>
  <start key=3 pos=297>
    <start key=4 pos=236></slut key=2 pos=362>
  </slut key=3 pos=380>
</slut key=4 pos=397>

Funktionen skal dermed give dette output:
start    pos        slut    pos
1    64        0    132
2    150        1    218
4    236        2    362
3    297        3    380
0    5        4    397

Håber i vil hjælpe mig igennem, og beklager at jeg ikke selv har haft overblik til at beskrive problemet ordentligt.
Avatar billede tipsen Nybegynder
14. juni 2003 - 01:35 #15
Det er vel lige før sådan et problem kan løses med en passende regulær expression?

Kan du forklare, hvad du skal bruge det til, så vi kan se om det overhovedet er nødvendigt med positionerne på dine tags!
Avatar billede jfl Nybegynder
14. juni 2003 - 12:51 #16
Det kan du have ret i. Det jeg skal bruge er:

<tag param=1 param=2>yalla yalla</tag> delt op i:
- den komplette streng "<tag param=1 param=2>yalla yalla</tag>"
- et array for parametrene param=1 param=2, som der kan være et forskelligt antal af.
- og selve indholdet "yalla yalla"

Vær opmærksom på at der inde i et tag, kan være flere tags, som vist i eksemplet "14/06-2003 01:11:32".

Sig til hvis vi skal løse det med penge via www.sharksforum.com
Avatar billede jfl Nybegynder
14. juni 2003 - 12:59 #17
Hvis kilden ser således ud:

<tag type=1 param=2 osv>tekst <tag type=2 param=2 osv>tekst tekst</tag> tekst</tag>

Skal jeg bruge:
- strengen "<tag type=1 param=2 osv>tekst <tag type=2 param=2 osv>tekst tekst</tag> tekst</tag>"
- et array med "type=1 param=2 osv"
- indholdet "tekst <tag type=2 param=2 osv>tekst tekst</tag> tekst"

og:
- strengen "<tag type=2 param=2 osv>tekst tekst</tag>"
- et array med "type=2 param=2 osv"
- indholdet "tekst tekst"

Giver det mening?
Avatar billede jfl Nybegynder
14. juni 2003 - 18:14 #18
Har fundet endnu en fejl.
Det skal se således ud:

<start key=0 pos=5>
  <start key=1 pos=64></slut key=0 pos=132>
  <start key=2 pos=150></slut key=1 pos=218>
  <start key=3 pos=236>
    <start key=4 pos=297></slut key=2 pos=362>
  </slut key=3 pos=380>
</slut key=4 pos=397>

Resultatet skulle så gerne blive:
start  pos        end    pos
0      5          0      132
1      64        1      218
2      150        2      362
3      236        3      380
4      297        4      397

Hvilket denne funktion kan klare:

$start_array = array(5,64,150,236,297);
$end_array = array(132,218,362,380,397);

$picked = array();
foreach ($end_array as $key_end_eval => $pos_end_eval) {
    foreach ($start_array as $key_start_eval => $pos_start_eval) {
        if ($pos_start_eval < $pos_end_eval) {
            $key_start = $key_start_eval;
            $pos_start = $pos_start_eval;
        }
    }
    $picked[$key_start] = $pos_start;
    $start_array = array_diff_assoc($start_array, $picked);
    echo($key_start.'='.$key_end_eval.'<br>');
}


Det kan uden tvivl gøres smartere. Og skulle i møde en person på en bar som har brugernavnet jfl på Eksperten, skylder han jer rigtig mange øl :)

Læg et svar, de af jer der vil have point. Tak for hjælpen!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

IT-JOB

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Specialister til Netværksoperations til Forsvarets nye Digitale Backbone

Politiets Efterretningstjeneste

Netværksspecialist til IT i PET

KMD A/S

Project Manager

Politiets Efterretningstjeneste

Tech Lead til klientområdet i PET

BEC Financial Technologies

Development Manager for Core Banking