Avatar billede gertnissen Nybegynder
09. juni 2005 - 21:48 Der er 13 kommentarer og
1 løsning

Array merge på keys

Hvordan laver jeg denne merge af 2 arrays.

Array1
[0] => A1
[1] => B1
[2] => C1

Array2
[0] => A2
[1] => B2
[2] => C2

Array1
[0] => A1
[1] => A2
[2] => B1
[3] => B2
[4] => C1
[5] => C2

en array_merge ville give mig følgende
Array1
[0] => A1
[1] => B1
[2] => C1
[3] => A2
[4] => B2
[5] => C2
og kan derfor ikke bruges.
Avatar billede ksoren Nybegynder
09. juni 2005 - 21:55 #1
de to arrays er altid lige store?

$Array3 = array();

for($i=0; $i<count($Array1); $i++){
    $Array3[] = $Array1[$i];
    $Array3[] = $Array2[$i];
}
Avatar billede gertnissen Nybegynder
09. juni 2005 - 22:00 #2
Fin løsning ellers - dejligt simpelt.

De er desværre sjældent lige store mht. antal keys. (fra 1 til uendelig). Kan man teste på længden inden tildelingen til array3 ?
Avatar billede olebole Juniormester
09. juni 2005 - 22:05 #3
<ole>

Nu kan dit spørgsmål læses på flere måder - men det kunne være, du kan bruge en af PHP's sorterings algoritmer efter din merge

/mvh
</bole>
Avatar billede ksoren Nybegynder
09. juni 2005 - 22:13 #4
$Array3 = array();

$len1 = count($Array1);
$len2 = count($Array2);
$len3 = $len1 > $len2 ? $len1 : $len2;

for($i=0; $i<$len3; $i++){
    if($i < $len1) $Array3[] = $Array1[$i];
    if($i < $len2) $Array3[] = $Array2[$i];
}
Avatar billede gertnissen Nybegynder
09. juni 2005 - 22:15 #5
jeg har faktisk lige kørt ksoren forslag og det virker faktisk selv om der ikke er lige mange elementer i de 2 arrays.

$Array3 = array();
$count = max(count($array1),count($array2));
for($i=0; $i<$count; $i++){
    $Array3[] = $array1[$i];
    $Array3[] = $array2[$i];
}

Jeg har ikke fundet en PHP array_merge der gør det 'rigtig' for mig, idet den concatenerer de 2 arrays 'oven-på-hinanden'. Hvis det skal løses med en sort, skal jeg på en eller anden måde kende den indbyrdes rækkefølge de havde oprindeligt (altså key rækkefølgen), da de var 'alene' eller måske findes der en anden løsning ?
Avatar billede olebole Juniormester
09. juni 2005 - 22:21 #6
Ikke, hvis det er den rækkefølge, du ønsker. Udfra spørgsmålet var det bare ikke til at se, om det var det, du ville - eller om du ville have en alfabetisk sorteret følge  :)
Avatar billede gertnissen Nybegynder
09. juni 2005 - 22:27 #7
ah, det er rigtig - der var ikke tænkt helt over at værdierne var fortløbende på den måde - sorry.

Hvad kalder man iøvrigt denne form for merge - intersection ?

ksoren, smider du et svar ?
Avatar billede barklund Nybegynder
09. juni 2005 - 23:44 #8
Løsningen fungerer ret skidt (faktisk slet ikke), hvis nøglerne ligger langt fra hinanden.

Så er det nok smartere som:

$a1 = array(1 => "a1", 1000 => "b1");
$a2 = array(1 => "a2", 100000 => "c2");
$a3 = array();
foreach(array_keys($a1+$a2) as $k) {
  if (isset($a1[$k])) $a3[] = $a1[$k];
  if (isset($a2[$k])) $a3[] = $a2[$k];
}

Så løber du kun de indekser igennem, som rent faktisk findes - og appender kun dem, der findes.

Og hvis man skulle beskrive hvad den gør, så kan man lidt sammenligne det med at blande kort - altså man fletter dem ind i hinanden ud fra deres indeks i hvert deres oprindelige array.

--
Morten Barklund
Avatar billede gertnissen Nybegynder
11. juni 2005 - 16:59 #9
Barklund det har du nok ret i, men jeg står i den heldige situation at der aldrig vil mangle nøgler og at de altid vil være fortløbende fra 0. Hvis jeg forstår det rigtigt så er din løsning er vel også bedre perfomancemæssigt hvis der mangler mange nøgler. I min situation hvad er så bedst: "for" eller "foreach(array_keys)" gennemløb.

Jeg står iøvrigt overfor et andet problem, idet jeg har 1 eller flere arrays jeg vil merge på den måde (online bestemt). Er der en god løsning på det, det virker fjollet blot at have "if (isset($a1[$k])) $a3[] = $a1[$k];" gentaget x gange - kan man bruge en løkke/rekursiv funktion til det ?
Avatar billede barklund Nybegynder
14. juni 2005 - 23:31 #10
Selvfølgelig kan du bruge en løkke. Men så er det vel smartest at have sine data som:

$input = array();
$input[1] = array(1 => "a1", 1000 => "b1");
$input[2] = array(1 => "a2", 100000 => "c2");
$output = array();
foreach(array_keys(array_reduce($input,create_function('$a,$b','return $a+$b;'),array())) as $k) {
  foreach($input as $a) {
    if (isset($a[$k])) $output[] = $a[$k];
  }
}

Det ser da meget sødt ud :)

--
Morten Barklund
Avatar billede gertnissen Nybegynder
18. juni 2005 - 23:11 #11
Stærkt Barklund, et array i 2 dimensioner der indeholder 1 eller flere andre arrays, jeg var for låst i løsningen med for-løkken fra ksoren.

Tak for hjælpen.

Smider I begge (ksoren, barklund) et svar, så får I begge fuld point.
Avatar billede barklund Nybegynder
26. juni 2005 - 15:28 #12
Fin fin :)
Avatar billede gertnissen Nybegynder
28. juni 2005 - 23:13 #13
ksoren, har ikke lagt svar. Så der kommer hermed fuld point til barklund.
Avatar billede barklund Nybegynder
28. juni 2005 - 23:15 #14
Well, tark anyways :)
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