ugrás a tartalomhoz

PHP tömb feltöltése ismétlődő elemekkel

gabeekex · 2010. Feb. 4. (Cs), 17.52
Sziasztok!

Szeretnék segítséget kérni a következő problémára:

Egy n elemű tömböt szeretnék feltölteni szakaszosan ismétlődő tömbelemekkel amíg a tömb elemeinek száma n nem lesz..

Valami hasonlóra gondoltam:

Adott néhány kötött ismétlődésű elem, pl.: a,b,c,d,e

Adott egy n = 15 elemű tömb, pl.: $betuk = array();

Adott egy algoritmus - és valójában ez a kérdésem

És a végén az eredmény ilyesmi kellene, hogy legyen

$betuk[1] = a
$betuk[2] = b
$betuk[3] = c
$betuk[4] = d
$betuk[5] = e
$betuk[6] = a
$betuk[7] = b
$betuk[8] = c
$betuk[9] = d
$betuk[10] = e
$betuk[11] = a
$betuk[12] = b
$betuk[13] = c
$betuk[14] = d
$betuk[15] = e

Mi lehet a megoldás?

A válaszokat előre is nagyon szépen köszönöm!
 
1

ez házifeladat? :)

errata · 2010. Feb. 4. (Cs), 19.45
ez házifeladat? :)
2

str_repeat

Poetro · 2010. Feb. 4. (Cs), 21.08
  1. <?php  
  2. // Az elemeket 3szor ismételjük hogy 15 elemű tömböt kapunk,   
  3. // trükközünk az elválasztó jellel, mivel rakunk egyet az elejére,   
  4. // ezért az explode előtt vesszővel kezdődik,   
  5. // ami a 0. elemnek üres stringet hagy meg, amit úgyis eldobunk.  
  6. $betuk = explode(','str_repeat(',a,b,c,d,e', 3));   
  7. unset($betuk[0]);  
  8. print_r($betuk);  
  9. ?>  
3

array_fill

Poetro · 2010. Feb. 4. (Cs), 21.17
  1. <?php  
  2. // Összerakjuk a 3szor megismételt tömbünket egy tömbbe.  
  3. $betuk = call_user_func_array(  
  4.   'array_merge',   
  5.   array_fill(0, 3, array('a','b','c','d','e'))  
  6. );  
  7. // Beszúrunk az elejére egy új elemet, hogy el tudjuk távolítani a 0. indexűt.  
  8. array_unshift($betuk, NULL);  
  9. unset($betuk[0]);  
  10. print_r($betuk);  
  11. ?>  
4

n elemű tömb van a

errata · 2010. Feb. 4. (Cs), 23.06
n elemű tömb van a példában...
  1. $elemek = array('a''b''c''d''e');  
  2. $n = 15;  
  3. $output = array();  
  4. for($i = 0; $i < $n$i++) {  
  5.     $output[] = $elemek[$i % count($elemek)];  
  6. }  
  7. print_r($output);  
jah és a tömbök számozása 0-tól indul, ha azt akarod hogy 1-töl induljon kb. 4 karaktert még bele kell írnod a kódba...
5

for ciklus

Poetro · 2010. Feb. 4. (Cs), 23.44
  1. <?php  
  2. $elemek = array('a','b','c','d','e');  
  3. $n = 15;  
  4. $betuk = array(NULL);  
  5. for ($i = 0, $elemek_meret = count($elemek); count($betuk) <= $n; ) {  
  6.   $betuk[] = $elemek[$i++];  
  7.   if ($i >= $elemek_meret) {  
  8.     $i = 0;  
  9.   }  
  10. }  
  11. unset($betuk[0]);  
  12. var_export($betuk);  
  13. ?>  
6

nem értem miért bonyolítod

errata · 2010. Feb. 5. (P), 01.41
nem értem miért bonyolítod túl?
van valamilyen oka, hogy ezt megoldást választod? (biztonság?, gyorsaság?)

eltolásos megoldás:
  1. $elemek = array('a''b''c''d''e');  
  2. $n = 15;  
  3. $output = array();  
  4. for($i = 1; $i <= $n$i++) {  
  5.     $output[$i] = $elemek[$i % count($elemek)];  
  6. }  
  7. print_r($output);  
7

maradékképzés (modulo)

Poetro · 2010. Feb. 5. (P), 02.03
egy nagyon lassú művelet az én megoldásomhoz képest, és semmivel sem egyértelműbb.
8

teszteltem mind a kettőnk

errata · 2010. Feb. 5. (P), 02.28
teszteltem
mind a kettőnk második szkriptjét lefuttattam 3* 1.000-szer print_r és var_export nélkül
eredmények:
enyém: 0.067055; 0.06697; 0.06852
tied: 0.082487; 0.078417; 0.082893

script amit használtam
  1. <?php   
  2.   
  3. $start = microtime();  
  4. for($j = 0; $j<1000; $j++):  
  5.   
  6. $elemek = array('a''b''c''d''e');  
  7. $n = 15;  
  8. $output = array();  
  9. for($i = 1; $i <= $n$i++) {  
  10.     $output[$i] = $elemek[$i % count($elemek)];  
  11. }  
  12.   
  13. endfor;  
  14. echo microtime()-$start;  
  15. ?>  
  16.   
  17. <?php  
  18.   
  19. $start = microtime();  
  20. for($j = 0; $j<1000; $j++):  
  21.   
  22.  $elemek = array('a','b','c','d','e');    
  23.  $n = 15;    
  24.  $betuk = array(NULL);    
  25.  for ($i = 0, $elemek_meret = count($elemek); count($betuk) <= $n; ) {    
  26.    $betuk[] = $elemek[$i++];    
  27.    if ($i >= $elemek_meret) {    
  28.      $i = 0;    
  29.    }    
  30.  }    
  31. unset($betuk[0]);  
  32.   
  33. endfor;  
  34. echo microtime()-$start;  
  35.   
  36. ?>  
egy kicsit átírva ezek az eredmények jöttek:

enyém: 0.018358, 0.020963, 0.019488
tied: 0.079171, 0.08944, 0.08088

módosított kód:
(precalc count() ahol lehetséges, a tiednél is)
  1. <?php   
  2.   
  3. $start = microtime();  
  4. for($j = 0; $j<1000; $j++):  
  5.   
  6. $elemek = array('a''b''c''d''e');  
  7. $n = 15;  
  8. $output = array();  
  9. $celemek = count($elemek);  
  10. for($i = 1; $i <= $n$i++) {  
  11.     $output[$i] = $elemek[$i % $celemek];  
  12. }  
  13.   
  14. endfor;  
  15. echo microtime()-$start;  
  16. ?>  
  17.   
  18. <?php  
  19.   
  20. $start = microtime();  
  21. for($j = 0; $j<1000; $j++):  
  22.   
  23.  $elemek = array('a','b','c','d','e');    
  24.  $n = 15;    
  25.  $betuk = array(NULL);  
  26.  $celemek = count($elemek);  
  27.  for ($i = 0, $elemek_meret = $celemekcount($betuk) <= $n; ) {    
  28.    $betuk[] = $elemek[$i++];    
  29.    if ($i >= $elemek_meret) {    
  30.      $i = 0;    
  31.    }    
  32.  }    
  33. unset($betuk[0]);  
  34.   
  35. endfor;  
  36. echo microtime()-$start;  
  37.   
  38. ?>  
ezek szerint az én gépemen az enyém gyorsabb...
9

Akkord generátor

gabeekex · 2010. Feb. 5. (P), 02.50
Valójában egy gitár akkord generátort szeretnék létrehozni, amely a szakdolgozatom részét képezné, és ez a kezdeti lépés hozzá, legalábbis szerintem.. Felveszek egy oktávot és kiiratom adott hangtól mondjuk 22 bundig.. mindegy.. megküzdök vele, remélem jó irányba indultam és köszönöm a segítségeket!

Itt lehet pontot adni a jó válaszra, vagy van valami? :D Bocsi új vagyok itt...

Üdv
10

Bonyolítjátok csak :D

deejayy · 2010. Feb. 5. (P), 11.43
  1. $str = 'abcde';  
  2. for ($i=0;$i<15;$i++) {  
  3.     $a[$i+1] = $str[$i%strlen($str)];  
  4. }  
11

"Adott néhány kötött

errata · 2010. Feb. 5. (P), 13.06
"Adott néhány kötött ismétlődésű elem..."
és mi van ha ez nem egy karakter? hanem pl: (a1, b2, c, d12, k555)
12

Valójában nem egy karakter

gabeekex · 2010. Feb. 5. (P), 13.41
Valójában nem egy karakteres elemekről van szó.

Hangok szerepelnének a tömbben: c, cisz, d, disz stb...
13

akkor az én példámnál maradva

errata · 2010. Feb. 5. (P), 13.52
akkor az én példámnál maradva (a többinél is hasonlóan):
  1. $elemek = array('c''d''e''f''g''a''h'); //hangok listája tömben  
  2. $n = 16; // a kotta hosszúsága  
  3. $output = array();    
  4. for($i = 1; $i <= $n$i++) {    
  5.     $output[$i] = $elemek[$i % count($elemek)];    
  6. }    
  7. print_r($output);  
ha ilyen 4/4-et akarsz beállítani meg tagolás, égészhangok félhangos stb...
akkor bonyolódik a dolog, ilyenkor érdemes lesz majd a gyűjtő tömbbe egy másik tömböt rakni az ütemeknek, abban pedig a hangoknak is külön tömb ami jelöli a hangot és a hosszúságát stb...
de biztos vannak még más megoldások is.