Lus een matrixwaarden terwijl u ze samenvoegt met een andere matrixwaarde

Ik heb twee arrays

$a = array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p');
$b = array('1','2','3','3','4','2','1','4','2','2');

Array $ a heeft soms meer waarden.

Ik moet me bij deze twee arrays voegen, maar voor resultaat moet ik waarden van de array $ b herhalen, zolang er waarden van de array $ a zijn.

Het resultaat zou zo moeten zijn

a1
b2
c3
d3
e4
f2
g1
h4
i2
j2
k1//array $b starts to loop here
l2
m3
n3
o4
p2
0
Je moet een kijkje nemen op bereik ().
toegevoegd de auteur str, de bron

4 antwoord

Het gebruik van de modulo (php: % ) is geweldig voor dit soort stuff:

$i = 0;
$count = count($b);
foreach($a as $val1){
    echo $val1, $b[$i++ % $count];
   //if you don't want to echo, do something else :)
}

Zodra $ i $ count bereikt, begint $ i% $ count opnieuw bij 0 .

3
toegevoegd
Overweeg het antwoord geaccepteerd. Ik moet gewoon een paar minuten wachten :)
toegevoegd de auteur Goldie, de bron
@Goldie Cool, blij dat ik kon helpen :)
toegevoegd de auteur middus, de bron
$i = 0;
$result = array();

foreach ($a as $val) {
  if (isset($b[$i])) {
    $result[] = $val.$b[$i++];
  } else {
    $result[] = $val.$b[0];
    $i = 1;
  }
}

print_r($result);
1
toegevoegd

Hier is een versie die werkt, ongeacht de lengte of de indexen van de twee arrays:

function zip(array $a1, array $a2) {
    $a1 = array_values($a1);//to reindex
    $a2 = array_values($a2);//to reindex

    $count1 = count($a1);
    $count2 = count($a2);

    $results = array();
    for($i = 0; $i < max($count1, $count2); ++$i) {
        $results[] = $a1[$i % $count1].$a2[$i % $count2];
    }

    return $results;
}

See it in action.

1
toegevoegd

Dit maakt $ b "loop-over" tot het zo groot is als $ a .

<?php
    $a = array('a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p');
    $b = array('1','2','3','3','4','2','1','4','2','2');
    while(count($b) < count($a))
        $b = array_merge($b, array_splice($b, 0, count($a) - count($b)));

    print_r($a);
    print_r($b);
?>
0
toegevoegd
@Jon yikes, goed punt. Vast.
toegevoegd de auteur Alex Turpin, de bron
@Ja inderdaad, de oplossing van Goldie is de beste.
toegevoegd de auteur Alex Turpin, de bron
Wat als $ a 100 items heeft en $ b heeft 10 (eigenlijk, wat als count ($ a)/count ($ b)> = 2 )?
toegevoegd de auteur Jon, de bron
@ Xeon06: Toch is het nog steeds niet goed genoeg IMHO: a) werkt niet goed als arrays niet numeriek geïndexeerd zijn, b) het zal een hele klus zijn om het correct te laten werken als je ook wilt "uitbreiden" $ a wanneer het korter is ( hier hoef je niet te doen, maar asymmetrisch gedrag zoals dat in een functie is een buggenerator), en c) er is echt niets gewonnen door al deze toe te voegen dubbele elementen: je kunt nog steeds een one-line loop-body schrijven zonder dit te doen. Gewoon wat stof tot nadenken - dit is een benadering waar ik ook aan heb gedacht :)
toegevoegd de auteur Jon, de bron
Werkt alleen als $ b minstens de helft is van $ a : codepad.org/Oa3EdqVk
toegevoegd de auteur jprofitt, de bron