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
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";
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!
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.
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.
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;
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 />";
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.
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]);
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.
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.
-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!
makumaku kirjoitti:
Siis tämähän oli just se tehtävän vaatimus!
Minkä tehtävän?
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.
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.
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.
Aihe on jo aika vanha, joten et voi enää vastata siihen.