Avaleht
uus teema   vasta Tarkvara »  WWW »  Vaja abi array loomisel märgi kõik teemad loetuks
märgi mitteloetuks
vaata eelmist teemat :: vaata järgmist teemat
Hinnavaatlus :: Foorum :: Uudised :: Ärifoorumid :: HV F1 ennustusvõistlus :: Pangalink :: Telekavad :: HV toote otsing
autor
sõnum Saada viide sõbrale.  :: Teata moderaatorile teata moderaatorile
otsing:  
LiivaneLord
Sõpradele "Olavi"

liitunud: 20.06.2006




sõnum 14.02.2012 21:55:13 Vaja abi array loomisel vasta tsitaadiga

Oskab keegi öelda, mis mul valesti on või anda nõu, mil viisil saab luua arrayd. Aadressil http://liivanelord.planet.ee/viking/index2.php?1=&2=&3=&4=&5=&6=&7=&8=&9=&10=&11=&sagedus=on&vt=Vaata on kõige parempoolsem tabel mõeldud selle jaoks, et näidata, millal numbrid 1-48 viimati Vikingus välja loositi

Nagu praegu näha, siis esimene number on 0, mida tegelikkuses vikingus välja ei loosita, aga olemas on seetõttu, et array ei salvesta võtmena lotonumbreid, vaid paneb neid lihtsalt järjest, alustades nullist. Ma tahaks luua array, kus võtmeks oleks lotonumber ja väärtuseks see, millal see number viimati välja loositi. Ehk siis tegelikkuses ei loositud nr 1 välja mitte 6 nädalat tagasi, vaid 7. Samamoodi 2 loositi välja mitte 8, vaid hoopis 6 nädalat tagasi jne. Ühesõnaga on nihkes see asi.

Minu eesmärk ei ole mitte seda nihet kaotada, vaid siduda omavahel lotonumber ja millal see viimati esines, sest ma tahan sellest nimekirjas luua teistsuguseid järjekordi ja siis läheb kogu numbrite järjekord paigast ära.

Kood, mis seda tabelit loob, on ise selline:
php:
  1. $array_n=array("I","II","III","IV","V","VI","lisa1","lisa2");
  2. $sagedus_array=array();
  3. for ($x=1;$x<=48;$x++){
  4. $v=-1;
  5. $vv=0;
  6. $sql_viimati=mysql_query("select * from $viking order by nr DESC");
  7.         while($viimati=mysql_fetch_array($sql_viimati)){
  8.                 $v=$v+1;
  9.                 foreach($array_n as $voti=>$väärtus){
  10.                         if($viimati[$väärtus]==$x){
  11.                                 $vv=1;
  12.                                 break;
  13.                         }
  14.                 }
  15.                 if($vv==1){
  16.                         break;}
  17.                         }
  18.                         $sagedus_array=array_merge($sagedus_array, array("$x"=>"$v"));
  19. }
  20. foreach($sagedus_array as $voti=>$vaartus){
  21.         echo "<tr><td>$voti</td><td>$vaartus</td></tr>";
  22. }


Ma ei saa sellest aru, miks $sagedus_array=array_merge($sagedus_array, array("$x"=>"$v")); ei loo mulle arrayd, mis sisaldab (1=>7, 2=>6, 3=>8 jne), vaid loob array hoopis selliselt (0=>7, 1=>6, 2=>8 jne)? Ometi ju lisasin "$x"=>"$v", kus võtmeks on lotonumber ($x) ja väärtuseks on nädala number, millal see viimati esines ($v).

Teine küsimus veel. Nagu praegu näha, siis see for avaldus tekitab andmebaasis 48 päringut 1 päringu asemel. Kas on võimalik teha üks päring ja selle alusel töödelda andmed? Proovisin lisada mysql_query enne for avaldust, kuid tulemuseks oli see, et nädala numbrid ei näidanud mitte numbrite viimast esinemist loetuna viimasest loosimisest, vaid loetuna eelmise numbri viimasest esinemisest.
Kommentaarid: 20 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 19
tagasi üles
vaata kasutaja infot saada privaatsõnum
keevitaja
AM 10 aastat
keevitaja

liitunud: 05.11.2001




sõnum 14.02.2012 22:48:44 vasta tsitaadiga

$sql_viimati=mysql_query("select * from $viking order by nr DESC");


see võtab ju kogu aeg ühed ja samad read välja. ja nii 48 korda järjest. milline su tabeli ehitus on. ma ei saa tegelikult aru, mida sa tahad teha.

_________________
Hinnavaatlus ei ole koht arvamuse avaldamiseks!
Kommentaarid: 51 loe/lisa Kasutajad arvavad:  :: 1 :: 3 :: 40
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
LiivaneLord
Sõpradele "Olavi"

liitunud: 20.06.2006




sõnum 15.02.2012 00:34:52 vasta tsitaadiga

keevitaja, ma tahan arrayd, milledes võtmeks ehk keyks oleks lotonumber (1-48) ja väärtuseks ehk valueks oleks vastavalt, et mitu nädalat tagasi see number viimati esines. Praegusel juhul küll tekib array, aga võti suureneb automaatselt ja algab nullist, kuid ainult väärtus on õige ja õiges järjekorras.

Mul on vaja seda arrayd, et saaksin nimekirja sorteerida, sest praegusel juhul on tabelis järjekord võtme kasvavas järjekorras, kuid mina soovin ka teisi järjestamise võimalusi. Sorteerida näiteks väärtuste kasvavasse/kahanevasse järjekorda.

Kui pole koodist aru saada, siis array_n on veergude nimekiri andmebaasis (I-VI põhinumbrid ning lisa1 ja lisa2 on lisanumbrid). $x algab numbrist 1 seetõttu, et lotonumbrid on 1-48. $v on number, mis näitab, mitu nädalat tagasi vastav lotonumber esines. Kui see oli möödunud nädalal, siis on see 0 ja vastavalt sellele kasvav.

Ma ei saanud tabeli ehituse küsimusest aru. icon_question.gif Kui kõige parempoolset tabelit pole näha, siis veendu, et linnuke on kastis "Näita numbrite esinemissagedust", kuigi URL kohaselt peaks see seal olema automaatselt.
Kommentaarid: 20 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 19
tagasi üles
vaata kasutaja infot saada privaatsõnum
keevitaja
AM 10 aastat
keevitaja

liitunud: 05.11.2001




sõnum 15.02.2012 01:05:08 vasta tsitaadiga

ma pidasin mysql tableit silmas.

$array_n=array("I","II","III","IV","V","VI","lisa1","lisa2");

array(
0 => 'I',
1 => 'II'
jne

sama moodi hakkavad keyd pihta nullist sul mysql_fetch_array puhul. ma ei tea, kas sellest on sulle nüüd kasu

_________________
Hinnavaatlus ei ole koht arvamuse avaldamiseks!
Kommentaarid: 51 loe/lisa Kasutajad arvavad:  :: 1 :: 3 :: 40
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
iFlop
Kreisi kasutaja
iFlop

liitunud: 03.05.2003



Autoriseeritud ID-kaardiga

sõnum 15.02.2012 01:13:05 vasta tsitaadiga

Sellise lotonumbrite sagedustabeli saaksid väga lihtsast andmebaasist otse kätte, kui baasi mudelis oleks iga loositud number oma reas.

Saan aru, et andmebaasis on tulemused sellisel kujul:
Loos   I    II    III   IV   V    VI   lisa1  lisa2
985    27   31    35    36   40   48   13     33

Mille mina muudaks aga mudeli selliseks:
loos   #     nr
985    I     27
985    II    31
985    III   35
985    IV    36
985    V     40
985    VI    48
985    lisa1 13
985    lisa2 33
Kommentaarid: 67 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 66
tagasi üles
vaata kasutaja infot saada privaatsõnum
LiivaneLord
Sõpradele "Olavi"

liitunud: 20.06.2006




sõnum 15.02.2012 01:50:04 vasta tsitaadiga

keevitaja, täiesti valesti oled asjast aru saanud. icon_sad.gif

iFlop, jah, täpselt selliselt on need andmebaasis, nagu esimesena mainisid. Igal loosil on oma rida ja seal on need vastavalt I, II, III jne.

Ma saan aru, et lotonumbri viimase väljaloosimise saan kätte sel viisil, et leian päringuga järjekorrast esimese numbri ja teen vastava loosimise numbri lahutuse, et saada kätte $v väärtus. Aga mul oleks sellegipoolest vaja arrayd, mille võtmeks on lotonumber ja väärtuseks see, millal see esines, sest mul on vaja seda sorteerida väärtuste kasvavasse/kahanevasse järjekorda, sest see on oluline info.

Eelkõige sooviks leida lahenduse praegusele andmebaasi tabelile, kui see võimalik. Kõik on praegu kena, kuid ma lihtsalt ei saa aru, miks praegusel juhul õiget arrayd ei teki? Kui lisan foreach avalduse ette rea sort($sagedus_array);, siis tekib tabel, kus on 0-0, 1-0, 2-0, 3-0 ... 8-1, 9-1 jne, mis ei ole õige informatsioon.
Kommentaarid: 20 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 19
tagasi üles
vaata kasutaja infot saada privaatsõnum
neros
HV Guru
neros

liitunud: 26.11.2003




sõnum 15.02.2012 08:54:00 vasta tsitaadiga


SELECT nr FROM $viking WHERE 'I' = $x OR 'II' = $x OR 'III' = $x OR 'IV' = $x OR 'V' = $x OR 'VI' = $x OR 'lisa1' = $x OR 'lisa2' = $x ORDER BY nr DESC LIMIT 1


Selle paned sinna asemele. Sealt saad kohe teada millisel nädalal see number viimati loositi. Miinusena muidugi, et tuleb 48 päringut.

... Muidugi kui sa soovid PHP'ga seda teha, viska enda praegune query üldse väljapoole for'i, tee temast massiiv ja parsi seda PHP'ga.

_________________
GitHub
.NET Core & Azure baasil lahendused ja arhitektuur - kontakt.
Kommentaarid: 48 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 40
tagasi üles
vaata kasutaja infot saada privaatsõnum
iFlop
Kreisi kasutaja
iFlop

liitunud: 03.05.2003



Autoriseeritud ID-kaardiga

sõnum 15.02.2012 10:53:40 vasta tsitaadiga

LiivaneLord, kui db tõesti muuta ei soovi siis saad kasutada union'i, ehk midagi sellist:
sql:
  1. SELECT nr, count(nr)
  2. FROM (
  3.         SELECT I AS nr FROM viking
  4.         UNION ALL
  5.         SELECT II AS nr FROM viking
  6.         UNION ALL
  7.         SELECT III AS nr FROM viking
  8.         UNION ALL
  9.         SELECT IV AS nr FROM viking
  10.         UNION ALL
  11.         SELECT V AS nr FROM viking
  12.         UNION ALL
  13.         SELECT VI AS nr FROM viking
  14.         UNION ALL
  15.         SELECT lisa1 AS nr FROM viking
  16.         UNION ALL
  17.         SELECT lisa2 AS nr FROM viking) AS numbrid
  18. GROUP BY nr
Kommentaarid: 67 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 66
tagasi üles
vaata kasutaja infot saada privaatsõnum
andrusny
Kreisi kasutaja
andrusny

liitunud: 20.03.2006




sõnum 15.02.2012 14:00:39 vasta tsitaadiga

tsitaat:
Aga mul oleks sellegipoolest vaja arrayd, mille võtmeks on lotonumber ja väärtuseks see, millal see esines


Kas ma saan nüüd õigesti aru, sul on näiteks II loosimine ja numbrid on seal 2, 6, 15

Siis sa sooviks sellist arrayd

2=>3, 6=>3, 15=>3
saad selliselt teha ju

$loto=Array();
$loto[2]=3;
$loto[6]=3;
$loto[15]=3;


Kuid kas poleks mõistlikum panna ühe loosimise numbrid kõik ühte masiivi?

$sql_viimati=mysql_query("select * from $viking order by nr DESC");
$loto=Array();
        while($viimati=mysql_fetch_array($sql_viimati)){
      $loto[1][]=$viimati['I'};
      $loto[2][]=$viimati['II'};
      $loto[3][]=$viimati['III'};
           // jne..

                }
// teise loosimise numbrid
var_dump($loto[2]);

_________________
Kommentaarid: 7 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 7
tagasi üles
vaata kasutaja infot saada privaatsõnum mine selle kasutaja kodulehele
LiivaneLord
Sõpradele "Olavi"

liitunud: 20.06.2006




sõnum 16.02.2012 00:21:33 vasta tsitaadiga

haha Hommik oli õhtust targem ja hommikul tuli hoopis teine idee, kuidas array luua. Nimelt sirvisin veel ka Kuutõrvaja lehte, et saada mingeid vihjeid ja meelde tuletada massiivi funktsionaalsusi ja leidsin rea
$massiiv[0] = "Jaan";
$massiiv[1] = "Peeter";
$massiiv[2] = "Laur";

Ja rakendasin seda koheselt ka oma koodis:

php:
  1. $array_n=array("I","II","III","IV","V","VI","lisa1","lisa2");
  2. $sql_viimati=mysql_query("select * from $viking order by nr DESC");
  3. for ($x=1;$x<=48;$x++){
  4. $v=-1;
  5. $vv=0;
  6.  
  7.         while($viimati=mysql_fetch_array($sql_viimati)){
  8.                 $v=$v+1;
  9.                 foreach($array_n as $voti=>$väärtus){
  10.                         if($viimati[$väärtus]==$x){
  11.                                 $vv=1;
  12.                                 break;
  13.                         }
  14.                 }
  15.                 if($vv==1){
  16.                         break;}
  17.                         }
  18.                         $sagedus_array[$x]=$v;
  19. }
  20. asort($sagedus_array);
  21. foreach($sagedus_array as $voti=>$vaartus){
  22.         echo "<tr><td>$voti</td><td>$vaartus</td></tr>";
  23. }

Lahendus oli lihtsamast lihtsam. icon_biggrin.gif Nagu näha, siis kasutasin kohe ka sorteerimist. http://liivanelord.planet.ee/viking/index2.php?1=27&2=31&3=35&4=36&5=40&6=33&7=&8=13&9=&10=&11=&sagedus=on&vt=Vaata on sorteerimisega ja http://liivanelord.planet.ee/viking/index3.php?1=&2=&3=&4=&5=&6=&7=&8=&9=&10=&11=&sagedus=on&vt=Vaata on ilma sorteerimiseta

Lisan, et numbrid on andmebaasis selliselt:
Spoiler Spoiler Spoiler

iFlop - saan nüüd hakkama ühe päringuga. Hiljem võibolla vajadusel piiran seda, sest tõenäosus näitab, et vähemalt 100-200 viimase loosimise hulgas on kõik numbrid esindatud. Aga usun, et selle koha pealt on kood optimaalne. icon_smile.gif

andrusny ei ole ka päris nii. I, II, III jne on ühel loosimisel välja loositud numbrid.

Ühesõnaga sain oma põhiküsimusele ideaalse lahenduse. Seda massiivi saan sorteerida nii, kuidas ise tahan.

On aga üks väike teemaväline küsimus. Kui kasutaja soovib oma numbreid kontrollida, siis tegin nüüd selliselt, et saadetud andmed lisatakse aadressile. Nt index2.php?1=12&2=23&3=34&4=&5=&6=&7=&8=&9=&10=&11=&sagedus=on&vt=Vaata . Kas on võimalik aadressist eemaldada need numbrid, mis on tühjad? Pean silmas juba enne andmete saatmist serverile või server töötleb selliselt, et ei tagastaks aadressi, kus on ka tühjad kirjed esindatud.

1, 2, 3 jne on input type="text" nimed. Kui ma jätan need väljad tühjaks, siis teoreetiliselt ei tohiks need ju ka aadressireale ilmuda. Kui kasutada sageduste checkboxi ja kui seal linnukest pole, ei ilmu seda ka aadressireale ja kui linnuke on valitud, on see aadressis. Kas sama meetodit ei saa rakendada kuidagi ka tekstikastides?

Uurisin netist asja ja seal kasutatakse keerulisi javascripti koode. Mingit lihtsat lahendust pole?
Spoiler Spoiler Spoiler


Edit: Krt, ikka ei saa ühe päringuga. Numbrid on valed. icon_sad.gif

Edit2: Lahendasin asja madedog poolt antud päringut kasutades ja kustutasin ära kõik mõttetud funktsioonid. icon_wink.gif

php:
  1. for ($x=1;$x<=48;$x++){
  2. $v=-1;
  3. $vv=0;
  4. $viimati=mysql_fetch_array(mysql_query("select nr from $viking where I=$x or II=$x or III=$x or IV=$x or V=$x or VI=$x or lisa1=$x or lisa2=$x order by nr DESC limit 1"));
  5. $sagedus_array[$x]=$loosimiste_hulk[0]-$viimati[nr];
  6. }
  7. asort($sagedus_array);
  8. foreach($sagedus_array as $voti=>$vaartus){
  9.         echo "<tr><td>$voti</td><td>$vaartus</td></tr>";
  10. }


Edit3: Sain kõik lahendatud! icon_smile.gif URLi probleemile sain lahenduse ning uuendasin seda html süntaksis. icon_smile.gif Suured tänud abistajatele, teist oli väga palju abi. icon_wink.gif
Kommentaarid: 20 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 19
tagasi üles
vaata kasutaja infot saada privaatsõnum
neros
HV Guru
neros

liitunud: 26.11.2003




sõnum 16.02.2012 06:19:21 vasta tsitaadiga

Oleks võinud kohe alguses pakutud queryt kasutada icon_wink.gif

Kui sa väga tahad, võid dünaamiliselt query kokku klopsida et ühe queryga hakkama saada..


$query = "";
for($x = 1; $x <= 48; $x++){
    if($x > 1)
        $query .= " UNION ALL ";
    $query .= "SELECT nr, $x AS pall FROM $viking WHERE I=$x OR II=$x OR III=$x OR IV=$x OR V=$x OR VI=$x OR lisa1=$x OR lisa2=$x ORDER BY nr DESC LIMIT 1";
}


Ei garanteeri et töötab nagu peab aga võiks icon_razz1.gif Kui soovid võid selle ka veel subquerysse mässida ja ülemises teha kõik sorteerimised. Saad kohe tagasi sorteeritud väärtused ja võid PHP sordi ka minema visata. Lisaks on dünaamilisi sortimisi parem teha.

Even though mulle väga subqueryd sellisel kujul ei meeldi, eriti need mis on dünaamiliselt kokku löödud, kipuvad suuremates tabelites aeglased olema, aga sul vist seda ei teki.

_________________
GitHub
.NET Core & Azure baasil lahendused ja arhitektuur - kontakt.
Kommentaarid: 48 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 40
tagasi üles
vaata kasutaja infot saada privaatsõnum
LiivaneLord
Sõpradele "Olavi"

liitunud: 20.06.2006




sõnum 16.02.2012 18:54:26 vasta tsitaadiga

madedog, ei tea midagi - kogu tabel sisaldab peaaegu 1000 rida. icon_wink.gif Vaikimisi on lühendatud 100 peale, kuna suure tabeli ettemanamine brauseri poolt on väikese viivitusega ja üldjuhul pole seda alati ka tarvis.
Kommentaarid: 20 loe/lisa Kasutajad arvavad:  :: 0 :: 0 :: 19
tagasi üles
vaata kasutaja infot saada privaatsõnum
neros
HV Guru
neros

liitunud: 26.11.2003




sõnum 17.02.2012 08:38:56 vasta tsitaadiga

Just nimelt icon_razz1.gif 1000 rida ei ole andmebaasi tabeli jaoks rohkem kui vette sülitamine kalamehe jaoks. "Suuremad tabelid" on juba kuue-seitsme numbri kanti ja rohkem, sõltuvalt kasutatavast mootorist ja struktuurist. Seni kuni indeksid paigas on ei tohiks probleeme tekkida.
_________________
GitHub
.NET Core & Azure baasil lahendused ja arhitektuur - kontakt.
Kommentaarid: 48 loe/lisa Kasutajad arvavad:  :: 0 :: 1 :: 40
tagasi üles
vaata kasutaja infot saada privaatsõnum
näita postitusi alates eelmisest:   
uus teema   vasta Tarkvara »  WWW »  Vaja abi array loomisel
[vaata eelmist teemat] [vaata järgmist teemat]
 lisa lemmikuks
näita foorumit:  
 ignoreeri teemat 
sa ei või postitada uusi teemasid siia foorumisse
sa ei või vastata selle foorumi teemadele
sa ei või muuta oma postitusi selles foorumis
sa ei või kustutada oma postitusi selles foorumis
sa ei või vastata küsitlustele selles foorumis
sa ei saa lisada manuseid selles foorumis
sa võid manuseid alla laadida selles foorumis



Hinnavaatlus ei vastuta foorumis tehtud postituste eest.