Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Array ongelma

Sivun loppuun

jussikok [06.04.2004 20:07:42]

#

Kun teen while-silmukassa tietokantahaun:

while($rivi = mysql_fetch_array($haku)){
$muuttuja[] = $rivi[2];
}

Niin onko mahdollista, että saisin while-silmukan ulkopuolella jotenkin tulostettua kaikki $muuttuja-muuttujan alkiot? Nythän se tulostaa vain "Array"-tekstin (a) , tai sitten määritetyn indeksinumeron. esim:

echo "$muuttuja"; // Tulostaa tekstin "Array"
echo "$muuttuja[0]"; // Tulostaa vain indeksi 0 arvon.

Olga [06.04.2004 21:13:34]

#

Niinkuin varmaan tiesit, tuo $muuttuja on taulukko. Eli käytä jotain silmukkaa sen arvojen tulostukseen.

<?php
foreach($muuttuja as $arvo)
  print $arvo."<br />";
?>

Suosittelen myös putkan php-oppaiden lukemista, niillä pääsee varsin hyvin alkuun.

ajv [06.04.2004 21:21:03]

#

No tuo ei vissiin kuitenkaan tulosta taulukon alkioita. Pikku editti tohon Irksomen vinkkiin:

<?php
foreach($muuttuja as $key => $arvo)
  print $key."<br />";
?>

Nyt pitäisi tulostua alkiot.

T.M. [06.04.2004 21:33:52]

#

Pieni korjaus: Ei tulosta alkioita, vaan niiden alkioiden nimet (key) :P

Irksome kirjoitti:

<?php
foreach($muuttuja as $arvo){
    print $arvo."<br />";
}
?>

Tuo tulostaa alkiot (add: kaarisulkeet)

<?php
foreach($muuttuja as $key => $arvo){
    print $arvo."<br />";
}
?>

Tuokin tulostaa alkiot

ajv [06.04.2004 21:40:10]

#

Niin ja tämä tulostaa sekä alkion nimen että arvon:

<?php
foreach($muuttuja as $key => $arvo){
  print "$key: $arvo<br>";
}
?>

:P:P

edit:Tulikohan asia selväksi??

Olga [06.04.2004 22:04:29]

#

Jo saatiin pikku asiasta iso kalabaliikki :) Eikö toi riittäny toi mun vastaus? :)

jussikok [06.04.2004 22:14:53]

#

Ei oikein tullut selväksi. Tarkoitus oli, että tulos voidaan kokonaisuudessaan tulostaa ihan missävain. Eikä vain:

foreach($muuttuja as $key => $arvo){
  print "$key: $arvo<br>";
}

ko. tapauksessahan tulostus tapahtuu foreach-silmukan sisällä. jos nuo muuttujat yrittää tulostaa silmukan ulkopuolella, niin vastaukseksi saa vain viimeisen arvon.

Olga [06.04.2004 22:20:11]

#

Täh? Voithan sä tulostaa noi missä vaan. Jos yksittäistä alkiota kaipaat, tulostat esim. $muuttuja[3] ja saat taulukon neljännen alkion.

ajv [07.04.2004 12:03:36]

#

Nyt ei siis ole ilmeisesti kyse alkion arvon tulostamisesta, vaan alkion nimen tulostamisesta.

print $muuttuja[3]; tulostaa taulukon neljännen alkion arvon eikä alkion nimeä.

Sanokaa jos olen väärässä.

acorn [07.04.2004 12:14:29]

#

array array_keys ( array input [, mixed search_value])

array_keys() returns the keys, numeric and string, from the input array.

Elikkä esim.:

$muuttuja = array(...);
$muuttuja_keys = array_keys($muuttuja);

jussikok [07.04.2004 13:57:54]

#

Taitaa olla pientä sekaannusta siinä, mitä tarkoitin.
Tarkoituksena on siis ensin hakea tietokannasta löytyvät
arvot:

$haku = mysql_query($kysely, $yhteys) or die("Virhe kyselyssä!");
if ( mysql_num_rows( $haku ) ){
while($rivi = mysql_fetch_array($haku)){
// Tehdään taulukko nimeltä $muuttuja kaikista tietokannasta
// saaduista arvoista. Muuttujat ovat viikon numeroita.
$varatut[] = $rivi[2];
}

Tämän jälkeen luodaan lista viikoista loppuvuotena

//tämänhetkinen viikko
$viikkonyt = date("W");
//vuoden viimeinen viikko
$taavuosi = date("Y");
$viimeinenviikko = date("W", mktime(0, 0, 0, 12, 31, $taavuosi));
Sitten pitäisi saada alasvetovalikkoon tulostumaan kaikki ne viikot, joita ei ole tietokannassa:
echo "<select name=viikko>";
//näytetään tämän vuoden loput viikot
for ($viikko = $kuukausinyt; $viikko <= $viimeinenkuukausi; $viikko++) {
    echo "<option value=$viikko>viikko: $viikko";
}
echo "</select></option>";

Ongelmana on nyt se, että jos käytän foreach-silmukkaa vaikkapa näin (tietokannassa on kolme arvoa tällä hetkellä, viikot 17,18 ja 19):

//näytetään tämän vuoden loput viikot
for ($viikko = $kuukausinyt; $viikko <= $viimeinenkuukausi; $viikko++) {
foreach ($varatut as $varattuviikko)
if ($viikko != $varattuviikko)
echo "<option value=$viikko>viikko: $viikko";
}

niin tulostuksesta tulee seuraavanlainen:

viikko: 15
viikko: 15
viikko: 15
viikko: 16
viikko: 16
viikko: 16
viikko: 17
viikko: 17
viikko: 18
viikko: 18
viikko: 19
viikko: 19

Eli siis ne viikot, jotka löytyvät kannasta tulee vain kaksi kertaa, mutta ne joita ei löydy kolme kertaa.

Olga [07.04.2004 14:18:52]

#

Sulla on kolme varattua viikkoa, 17, 18 ja 19. Sit käyt tuossa sisemmässä silmukassa ne kaikki varatut viikot läpi ja jos ei täsmää, tulostetaan tuo option. Eli se tulostaa silloin kolme kertaa (varattujen viikkojen lkm) tuon viikon. Ja jos taas löytyy niin silloin kaks kertaa (ei löydy kaks kertaa). Käytä sisemmän silmukan tilalla funktiota in_array(), joka tarkistaa löytyykö annettua arvoa taulukosta. Eli

<?php
for($viikko=$kuukausinyt;$viikko<=$viimeinenkuukausi;$viikko++) {
  if(!in_array($viikko,$varatut))
    echo "<option value='$viikko'>viikko: $viikko</option>\n";
}
?>

Edit: Kieltämättä hieman epäselvästi tosiaan selitit ekalla kerralla... :)

jussikok [07.04.2004 14:28:28]

#

KIITOS!!!!! Nyt toimii juuri niinkuin pitää :)

jussikok [07.04.2004 14:28:33]

#

KIITOS!!!!! Nyt toimii juuri niinkuin pitää :)

jussikok [07.04.2004 15:52:53]

#

Eipäs toimikkaan ihan täysin. Jos arvoa ei tietokannasta löydy, niin silloin tulostaa että:
warning in_array(): wrong datatype for second argument in......line xx
Mitäs tähän tulisi tehdä?

Olga [07.04.2004 16:02:07]

#

No varmaan on hyvä kattoa ennen silmukkaa että onko siellä kannassa yhtään mitään ja jos on, onko enemmän ku yks. Ku jos siinä taulukossa on vaan yks arvo, ei se oo vielä taulukko.


Sivun alkuun

Vastaus

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

Tietoa sivustosta