[PHP] Arrays mixen met patroon

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • verytallman
  • Registratie: Augustus 2001
  • Laatst online: 18-08 18:12
Ik heb 2 arrays die ik wel mixen, maar niet zomaar: om de x aantal elementen van Array1 moet een element van Array2 komen, snappie ? :P

Ik wil een 'patroon' erin hebben zodat de arrays goed gemixed worden, en aangezien beide arrays kunnen verschillen van grote moet dit 'patroon' elke keer berekend worden:
PHP:
1
2
3
4
5
if ($aantalElementenArray1 > aantalElementenArray2) {
   patroon = floor($aantalElementenArray1/aantalElementenArray2);
} else {
   patroon = floor($aantalElementenArray2/aantalElementenArray1);
}

In het voorbeeld hieronder is het patroon: 4/2 = 2.
Dus om de 2 elementen van Array1 komt 1 elementen van Array2.

Array1[0][cijfer] = 0
Array1[1][cijfer] = 1
Array1[2][cijfer] = 2
Array1[3][cijfer] = 3

Array2[0][cijfer] = 10
Array2[1][cijfer] = 11

Moet worden:
Array3[0][cijfer] = 0
Array3[1][cijfer] = 1
Array3[2][cijfer] = 10
Array3[3][cijfer] = 2
Array3[4][cijfer] = 3
Array3[5][cijfer] = 11


Alleen hoe doe ik dit in PHP ?

Acties:
  • 0 Henk 'm!

  • WhizzCat
  • Registratie: November 2001
  • Laatst online: 15-05-2024

WhizzCat

www.lichtsignaal.nl

http://nl3.php.net/manual/en/ref.array.php hier al gekeken?

Misschien kun je iets frutten met array_merge() en array_multisort(). Dat lijkt mij tenminste de meest elegante oplossing :)

Gezocht: netwerkbeheerder
Als je het niet aan een 6-jarige kan uitleggen, snap je er zelf ook niks van! - A. Einstein


Acties:
  • 0 Henk 'm!

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 22-07-2024
je kan ook werken met mod (%) en een lijstje

dus iets als: (pseudocode)
code:
1
2
3
4
5
6
7
8
zolang (i < array1.length OF i < array2.length) {
  i++;
  if (i % 2 == 'iets') {
    nieuwarray += array1[i]
  } else {
    nieuwarray += array2[i]
  }
}

[ Voor 13% gewijzigd door BasieP op 01-03-2006 07:50 ]

This message was sent on 100% recyclable electrons.


Acties:
  • 0 Henk 'm!

  • verytallman
  • Registratie: Augustus 2001
  • Laatst online: 18-08 18:12
Ik heb de oplossing gevonden, hij werkt goed. Ik zal hem voor de search hieronder neerzetten.
Als iemand een betere manier weet laat het me weten.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
if ($numElementsArray1 >= $numElementsArray2) {
        
    $patern = floor($numElementsArray1/$numElementsArray2);
    $counterArray2 = 0;
        
    for ($i=0 ; $i < $numElementsArray1 ; $i) { // Hier $i niet verhogen dat gebeurt in de loop hieronder al
        for ($i2=1 ; $i2 <= $patern ; $i2++) {
            $Array3[] = array(  "id"    => $Array1[$i]['cijfer'] );
            $i++;
            if ($i == $numElementsArray1) { // Niet ($numElementsArray1 - 1) omdat $i voor de volgende loop geld
                $i2 = $patern;
            }           
        }
            
        if ($counterArray2 < $numElementsArray1) {
            $Array3[] = array(  "id"    => $Array2[$counterArray2]['cijfer'] );
                
            $counterArray2++;
        }
    }
} else { 
    // alles andersom
}

Acties:
  • 0 Henk 'm!

Verwijderd

Als je goed wilt mixen, dan moet je er juist geen patroon in brengen. Ik zou elke entry van array 1 en array 2 een random nummer toekennen, en de arrays aan elkaar plakken, en dan sorteren op het random nummer.

Acties:
  • 0 Henk 'm!

Verwijderd

PHP:
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
function ritsen($x,$y) { // call with two arrays

    $s[] = count($x);
    $s[] = count($y);
    
    if($s[0]>=$s[1]) {
        $jump = floor($s[0]/$s[1]);
        $a = $x;
        $b = $y;
    } else {
        $jump = floor($s[1]/$s[0]);
        $a = $y;
        $b = $x;
    }

    for($i=0,$w=0;$i<sizeof($a);$i++) {
        $array[] = $a[$i];
        if(($i+1)%$jump==0 && isset($b[$w])) {
            $array[] = $b[$w]; $w++;
        }
    }

    return $array;

}

[ Voor 7% gewijzigd door Verwijderd op 02-03-2006 09:46 ]


Acties:
  • 0 Henk 'm!

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function ritsen2($x,$y) {

    $j = count($x)/count($y);

    if($j>1) {
        $a = $x;
        $b = $y;
    } else {
        $j = 1/$j;
        $a = $y;
        $b = $x;
    }
    
    while($p = array_pop($b)) 
        array_splice($a,$j*count($b),0, array($p));
    
    return $a;
}

Bij deze is de output array net even iets anders opgebouwd maar het patroon is identiek..
Pagina: 1