Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Taulukoiden yhdistäminen

Sivun loppuun

novari [02.04.2011 13:48:58]

#

Tulipa pieni ongelma kun pitäisi yhdistää kaksi taulukkoa joissa toisessa on neljä numeroa ja toisessa kolme numeroa.
Tuo yhdistäminen onnistuu aika usein mutta silloin tällöin kolmenumeroa olevasta taulukosta jää puuttumaan yksi tai kaksi numeroa.
Echotan muuttujat ennen yhteenlaskua ja ne ovat oikein mutta yhteenlaskun jälkeen joskus jää uupumaan yksi numero ja harvoin kaksi numeroa.
Mistä tuo johtuu?

$kolme = array_rand($numerot, 3); // Arpoo kolme numeroa
//näillä tarkistan että luvut on oikein
echo implode("|", $nelja); //tulostaa oikein
echo"_";
echo implode("|", $kolme); //tulostaa oikein

$sarake = $nelja + $kolme; // tässä tulee virhe, muuttujasta $kolme jää joskus puuttumaan yksi numero, ei aina, joskus harvoin kaksi numeroa. $nelja:stä ei kertaakaan
// yhteenlaskun tarkistus
echo"_";
echo implode("|", $sarake);//tästä näkee virheen missä se on. Puuttuva numero on AINA muuttujasta $kolme

Metabolix [02.04.2011 13:53:04]

#

Mitähän ihmettä yrität tehdä?

Edit: Pitkän pähkäilyn jälkeen päädyin arvaukseen, että koodisi on täysin pielessä ja tavoite on yksinkertaisesti tämä:

$kolme = array(1, 2, 3);
$nelja = array(4, 5, 6, 7);
$yhteensa = array_merge($kolme, $nelja);
echo implode(", ", $yhteensa), "\n";

novari [02.04.2011 14:03:30]

#

Kiitos, nyt toimii. Ohjelma on lottoarpoja joka tekee kuusi riviä 39:stä siten että numerot on erilaisia. Kuudennessa rivissä jäljelle jääneiden neljän numeron lisäksi arvotaan kolme numeroa jotka yhdistetään yhdeksi riviksi. Tuo taulukoiden yhdistäminen ei muistunut mieleen vaikka olen sen joskus lukenut. Heti palautui mieleen kun annoit esimerkkikoodin. Kiiiitos!

Metabolix [02.04.2011 14:07:55]

#

Muokkasinkin jo erään ratkaisutavan ylle.

Elämääsi ehkä helpottaisi, jos kokeilisit yksinkertaisemmilla syötteillä (kuten vakiotaulukoilla), mitä koodissasi oikein tapahtuu. Myös dokumentaatiosta on paljon apua.

Aloittelijana sinun kannattaa myös miettiä, miten asian voisi toteuttaa itse. Tuossakin voisit tehdä tyhjän taulukon ja lisätä sitten vaikka foreach-silmukalla sinne kummankin muun taulukon luvut, tai voisit nuo oikein tulostuvat implode-tekstit yhdistää ja purkaa explodella taulukoksi.

makumaku [02.04.2011 14:12:08]

#

Kyllä + (array union operator) on ihan laillinen operaattori kahden taulukon kanssa. Eri asia sitten on että missä sitä voi ja kannataa käyttää.

Jos kahden taulukon avaimet ovat uniikkeja, niin silloin yhdistäminen onnistuu niin että kaikki arvot tulevat yhdistettyyn taulukkoon. Jos samoja avaimia esiintyy kahdessa eri taulokossa nini sitten tapahtuu ylikirjoittamista.

Mutta ehkä kätevämpää olisi käyttää jotakin array_merge tai vastaavaa funkkaria.

Lebe80 [02.04.2011 15:09:40]

#

novari kirjoitti:

$sarake = $nelja + $kolme; // tässä tulee virhe, muuttujasta $kolme jää joskus puuttumaan yksi numero, ei aina, joskus harvoin kaksi numeroa. $nelja:stä ei kertaakaan

?!?!

Pitikö tässä oikeasti yhdistää kaksi merkkijonoa?
Tällöin lause olisi:
$sarake = $nelja . $kolme;

makumaku [02.04.2011 15:12:37]

#

Opettavaisinta varmaan olisi tehdä tuo käyttäen for-looppeja, iffejä tarkistukseen jne... Mutta tuon voi tehdä myös käyttäen hyväksi php_n taulukkofunktioitakin. Tässä yksi esimerkki:

// Tehdään taulukko lottonumeroilla 1-39
$lottonumerot = range(1, 39);
// Sekoitetaan taulukko satunnaiseen järjestykseen
shuffle($lottonumerot);
// Paloitellaan taulukko 7 numeron riveiksi, viimeiseen jää vain 4 numeroa
$lottorivit = array_chunk($lottonumerot, 7, true);
// Sekoitetaan taas lottonumerot
shuffle($lottonumerot);
// Lisätään vaillinaiseen riviin kolme numeroa
$lottorivit[5] = array_merge($lottorivit[5], array_slice($lottonumerot, 0, 3));
// Tulostetaan rivit
foreach($lottorivit as $rivi)
    echo implode(", ", $rivi), "<br />";

novari [03.04.2011 11:01:02]

#

Tuo makumaku:n esimerkki on lyhyempi kuin minun mutta yksi virhe siinä on.
Kun lisätään vaillinaiseen riviin kolme numeroa niin $lottonumeroista täytyy poistaa nuo olemassaolevat neljä numeroa, muutoin voi tulla samoja numeroita kuudenteen riviin. Muutoin hieno esimerkki.

novari [03.04.2011 11:18:57]

#

Lisäsin yhden rivin makumaku:n esimerkkiin niin ei tule enää samoja numeroita kuudenteen riviin. Ennen koodiriviä 8 lisätään tämä rivi.

$lottonumerot = array_diff($lottonumerot, $lottorivit[5]);

makumaku [03.04.2011 11:34:24]

#

Totta tosiaan, eipä ollut tuo mielessä, ja kun en testannut juurikaan niin ei tullut siinäkään esille. Hienoa että huomasit!
Toinen pieni kauneusvirhe tuossa tietenkin on että lottorivit taulukossa eri rivien indeksit eivät enää sekoituksen ja paloittelun jälkeen mene kauniisti 0->6, mutta tässä se ei haittaa.

-tossu- [03.04.2011 18:41:04]

#

makumaku kirjoitti:

Toinen pieni kauneusvirhe tuossa tietenkin on että lottorivit taulukossa eri rivien indeksit eivät enää sekoituksen ja paloittelun jälkeen mene kauniisti 0->6, mutta tässä se ei haittaa.

Indeksit saa menemään kaikissa riveissä 0->6, jos ei aseta array_chunkin viimeiseksi parametriksi truea. Miksi edes olet antanut array_chunkille viimeisen valinnaisen parametrin, josta ei ole tässä yhteydessä kuin haittaa?

Toinen "vika" koodissasi on se, että jälkimmäisissä riveissä voi olla vain niitä numeroita, joita edellisissä ei ole ollut. Poikkeuksena tietysti viimeinen rivi, johon lisätään kolme satunnaista numeroa.

makumaku [03.04.2011 19:35:03]

#

-tossu- kirjoitti:

Toinen "vika" koodissasi on se, että jälkimmäisissä riveissä voi olla vain niitä numeroita, joita edellisissä ei ole ollut. Poikkeuksena tietysti viimeinen rivi, johon lisätään kolme satunnaista numeroa.

Siis tämähän oli just se tehtävän vaatimus!

Metabolix [03.04.2011 20:03:24]

#

makumaku kirjoitti:

Siis tämähän oli just se tehtävän vaatimus!

Minkä tehtävän?

makumaku [03.04.2011 20:31:10]

#

novari kirjoitti:

Ohjelma on lottoarpoja joka tekee kuusi riviä 39:stä siten että numerot on erilaisia.

Itse ymmärsin että kaikkien viiden rivin numerot ovat erilaisia, eli yhtä numeroa käytetään vain kerran, poislukien viimeisen (kuudennen) rivin kolme numeroa.

novari [04.04.2011 10:12:15]

#

Makumaku:n esimerkkikoodi on juuri se mitä olin hakemassa, kiitos hänelle siitä.
Otin sen käyttöön koska se on paljon lyhyempi kuin oma tekeleeni.
Mitä tekee -tossu-:n ehdottama array_chunk:n true poistaminen? Kokeilin sitä mutta en löytänyt mitään eroavaisuutta ohjelmassa. No minähän en ymmärräkkään näitä koodeja pahemmin. Minulle riittää että ohjelma tekee sen mitä siltä odotan.

makumaku [04.04.2011 10:30:53]

#

Tuosta array_chunk:sta sen verran että-tossu- on kommentissaan täysin oikeassa. Tuo true on turha ja jopa ei-toivottava tässä yhteydessä. En itsekään osaa sanoa että miksi sen sinne heitin. Käytännössä tekee sen että se säilyttää alkuperäiset taulukkoavaimet myös tässä uudessa taulukossa. Järkevintä tietenkin olisi poistaa tuo true ja indeksit menisi kauniisti 0->6.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta