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

array_fill

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

n elemű tömb van a

errata · 2010. Feb. 4. (Cs), 23.06
n elemű tömb van a példában...

$elemek = array('a', 'b', 'c', 'd', 'e');
$n = 15;
$output = array();
for($i = 0; $i < $n; $i++) {
    $output[] = $elemek[$i % count($elemek)];
}
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
<?php
$elemek = array('a','b','c','d','e');
$n = 15;
$betuk = array(NULL);
for ($i = 0, $elemek_meret = count($elemek); count($betuk) <= $n; ) {
  $betuk[] = $elemek[$i++];
  if ($i >= $elemek_meret) {
    $i = 0;
  }
}
unset($betuk[0]);
var_export($betuk);
?>
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:


$elemek = array('a', 'b', 'c', 'd', 'e');
$n = 15;
$output = array();
for($i = 1; $i <= $n; $i++) {
    $output[$i] = $elemek[$i % count($elemek)];
}
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

<?php 

$start = microtime();
for($j = 0; $j<1000; $j++):

$elemek = array('a', 'b', 'c', 'd', 'e');
$n = 15;
$output = array();
for($i = 1; $i <= $n; $i++) {
    $output[$i] = $elemek[$i % count($elemek)];
}

endfor;
echo microtime()-$start;
?>

<?php

$start = microtime();
for($j = 0; $j<1000; $j++):

 $elemek = array('a','b','c','d','e');  
 $n = 15;  
 $betuk = array(NULL);  
 for ($i = 0, $elemek_meret = count($elemek); count($betuk) <= $n; ) {  
   $betuk[] = $elemek[$i++];  
   if ($i >= $elemek_meret) {  
     $i = 0;  
   }  
 }  
unset($betuk[0]);

endfor;
echo microtime()-$start;

?>
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)

<?php 

$start = microtime();
for($j = 0; $j<1000; $j++):

$elemek = array('a', 'b', 'c', 'd', 'e');
$n = 15;
$output = array();
$celemek = count($elemek);
for($i = 1; $i <= $n; $i++) {
    $output[$i] = $elemek[$i % $celemek];
}

endfor;
echo microtime()-$start;
?>

<?php

$start = microtime();
for($j = 0; $j<1000; $j++):

 $elemek = array('a','b','c','d','e');  
 $n = 15;  
 $betuk = array(NULL);
 $celemek = count($elemek);
 for ($i = 0, $elemek_meret = $celemek; count($betuk) <= $n; ) {  
   $betuk[] = $elemek[$i++];  
   if ($i >= $elemek_meret) {  
     $i = 0;  
   }  
 }  
unset($betuk[0]);

endfor;
echo microtime()-$start;

?>
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
$str = 'abcde';
for ($i=0;$i<15;$i++) {
	$a[$i+1] = $str[$i%strlen($str)];
}
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):

$elemek = array('c', 'd', 'e', 'f', 'g', 'a', 'h'); //hangok listája tömben
$n = 16; // a kotta hosszúsága
$output = array();  
for($i = 1; $i <= $n; $i++) {  
    $output[$i] = $elemek[$i % count($elemek)];  
}  
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.