Tuolla oli eräs vinkki, miten saada akkosjärjestykseen tiedosto, jossa on kaksi "solua". https://www.ohjelmointiputka.net/keskustelu/4402-top-lista
Kyse on viimeisestä tuolla olevasta ohjeista.
Minun tapauksessani SORT_STRING on sopiva, mutta miten saan tuon toimimaan, kun tiedostossa on lokeroita 0-6:teen?
Ilmeisesti kyse on siis moniulotteisesta taulukosta? Jos ymmärsin väärin, niin pahoittelen, mutta itsekin aikoinaan näiden moniulotteisten kanssa pähkäilin, ja homma selvisikin. Eli array_multisort on funktio ja parametreiksi täytyy antaa kaikki lajiteltavat sarakkeet. Esimerkkinä esimerkiksi nimimerkin tnguyen at scpie dot com kommentti.
Onkohan tämä suunnilleen oikein:
<?php foreach($kayttajat as $users) { $users = explode("|", $users); $lista=array($users[0],$users[2],$users[3],$users[4],$users[5],$users[6]); } array_multisort($lista["$lista[0]"],SORT_STRING,$lista["$lista[1]"],$lista["$lista[2]"],$lista["$lista[3]"],$lista["$lista[4]"],$lista["$lista[5]"]); ?>
Miten tuosta eteenpäin? Pitäisikö tulostaa käyttämällä for-silmukkaa?
Hmm, täytyypä ihan miettiä. Eli sulla on tiedostossa tiedot seuraavasti:
tieto1|tieto2|tieto3|tieto4
tieto1|tieto2|tieto3|tieto4
ja niin edelleen, ja ne pitäis saada sortattua aakkosjärjestykseen jonkun sarakkeen mukaan.
Eli: (mietin tässä samalla, joten tämä on vain ajatusvirtaa... :))
<?php $taulu = file("tiedosto.txt"); $kayttajat = array(); // taulu käyttäjätiedoille foreach($taulu as $kayttaja) { $kayttajatiedot = explode("|",trim($kayttaja)); $kayttajat[] = $kayttajatiedot; } // foreach ?>
Eli nyt sit olis moniulotteinen taulukko $kayttajatiedot, joka pitäis saada sortattua jonkun sarakkeen mukaan.
<?php // lajitellaan ensimmäisen sarakkeen mukaan array_multisort($kayttajatiedot[0],SORT_ASC,SORT_STRING,$kayttajatiedot[1],$kayttajatiedot[2],$kayttajatiedot[3]); // tulostus print "<table border='1'>"; foreach($kayttajatiedot as $kayttaja) { print "<tr>"; foreach($kayttaja as $arvo) print "<td>$arvo</td>"; print "</tr>"; } // foreach print "</table>"; ?>
Ja tuohon multisorttiin voi laittaa noihin muihinkin sarakkeisiin noita ehtoja (SORT_NUMERIC, SORT_DESC jne.), jos haluaa lajitella edellisen sarakkeen "samoja arvoja" (en osaa paremmin selittää).
Ja tuon vedin tosiaan ihan hatusta, joten sitä saa kokeilla ihan omalla vastuulla :)
Tuota. Innostuin tuosta Irksomen esimerkistä käyttää multisorttia, mutta en kuitenkaan saanut toimimaan.
Tässä kuitenkin oma systeemini, millä olen tuonlaiset sorttaukset hoitanut:
<?php /* Tekstitiedoston sisältö: AAA|100|ÖÖÖ BBB|300|RRR CCC|200|AAA */ //muodostetaan moniulotteinen taulukko tiedostosta $taulu = file("tiedosto.txt"); for($i=0; $i<count($taulu);$i++){ $kayttajatiedot = explode("|",trim($taulu[$i])); for($k=0; $k<count($kayttajatiedot); $k++){ $kayttajat[$i]["col_$k"] = $kayttajatiedot[$k]; } } /* taulukko täyttyy muotoon $kayttajat[0][col_0] = AAA $kayttajat[0][col_1] = 100 $kayttajat[0][col_2] = ÖÖÖ $kayttajat[1][col_0] = BBB $kayttajat[1][col_1] = 300 $kayttajat[1][col_2] = RRR $kayttajat[2][col_0] = CCC $kayttajat[2][col_1] = 200 $kayttajat[2][col_2] = AAA */ //Näytetään tiedoston sisältö print "<b>Tiedoston sisältö:</b>\n<pre>"; include("tiedosto.txt"); print "</pre>\n"; //tehdään "aputaulukko" $mix. sortataan 1. sarakkeen mukaan -> $det['col_0'] foreach ($kayttajat as $val => $det) $mix[$val] = $det['col_0']; //sortataan aputaulukon avulla array_multisort($mix, SORT_ASC, $kayttajat); print "<b>1. sarakkeen mukaan sortattuna</b>\n<table border='1'>\n"; foreach($kayttajat as $kayttaja) { print " <tr>\n"; foreach($kayttaja as $arvo) print " <td>$arvo</td>\n"; print " </tr>\n"; } // foreach print "</table>\n<br><br>\n"; foreach ($kayttajat as $val => $det) $mix[$val] = $det['col_1']; array_multisort($mix, SORT_ASC, $kayttajat); //tulostetaan print "<b>2. sarakkeen mukaan sortattuna</b>\n<table border='1'>"; foreach($kayttajat as $kayttaja) { print " <tr>\n"; foreach($kayttaja as $arvo) print " <td>$arvo</td>\n"; print " </tr>\n"; } // foreach print "</table>\n<br><br>\n"; foreach ($kayttajat as $val => $det) $mix[$val] = $det['col_2']; array_multisort($mix, SORT_ASC, $kayttajat); //tulostetaan print "<b>3. sarakkeen mukaan sortattuna</b>\n<table border='1'>"; foreach($kayttajat as $kayttaja) { print " <tr>\n"; foreach($kayttaja as $arvo) print " <td>$arvo</td>\n"; print " </tr>\n"; } // foreach print "</table>\n<br><br>\n"; ?>
Esimerkki löytyy täältä.
En saanut toimimaan noilla. Olen nyt saanut tehtyä tämmöisen:
<?php $kayttajat=file($user_dir); echo "<table>"; foreach($kayttajat as $users) { $users = explode("|", $users); $data_array["Tunnus"][$i]=$users[0]; $mess=file($users[2]); $data_array["Viesteja"][$i]=$mess[0]; $data_array["Oikea_nimi"][$i]=$users[3]; $data_array["Paikkakunta"][$i]=$users[4]; $data_array["Kotisivu"][$i]=$users[5]; $data_array["Sahkoposti"][$i]=$users[6]; array_multisort($data_array["Tunnus"],SORT_ASC,SORT_STRING,$data_array["Viesteja"], $data_array["Oikea_nimi"],$data_array["Paikkakunta"],$data_array["Kotisivu"],$data_array["Sahkoposti"]); echo '<tr><td>'.$data_array['Tunnus'][$i].'</td> <td>'. $data_array['Viesteja'][$i].'</td> <td>'. $data_array['Paikkakunta'][$i].'</td> <td>'. $data_array['Kotisivu'][$i].'</td> <td>'. $data_array['Sahkoposti'][$i].'</td> </tr>'; } echo "</table>"; ?>
Tulostaa muuten oikein, mutta tuo aakkosjärjestys ei muutu miksikään
Pekka Mansikka kirjoitti:
Tulostaa muuten oikein, mutta tuo aakkosjärjestys ei muutu miksikään
No eikä ihmekkään, sillä tulostat sitä mukaan kun luet tiedostoa taulukkoon. Siis
Edit: Seuraavan pitäisi toimia
<?php $taulu = file($user_dir); //LUETAAN TIEDOT TAULUKKOON for($i=0; $i<count($taulu);$i++){ $users = explode("|",trim($taulu[$i])); $data_array[$i]["Tunnus"]=$users[0]; $mess=file($users[2]); $data_array[$i]["Viesteja"]=$mess[0]; $data_array[$i]["Oikea_nimi"]=$users[3]; $data_array[$i]["Paikkakunta"]=$users[4]; $data_array[$i]["Kotisivu"]=$users[5]; $data_array[$i]["Sahkoposti"]=$users[6]; } //TEHDÄÄN SORTTAUS foreach ($data_array as $val => $det) $mix[$val] = $det['Tunnus']; array_multisort($mix, SORT_ASC, SORT_STRING, $kayttajat); //TULOSTETAAN echo "<table>\n"; for($i=0; $i<count($taulu);$i++){ echo '<tr><td>'.$data_array['Tunnus'][$i].'</td> <td>'. $data_array[$i]['Viesteja'].'</td> <td>'. $data_array[$i]['Paikkakunta'].'</td> <td>'. $data_array[$i]['Kotisivu'].'</td> <td>'. $data_array[$i]['Sahkoposti'].'</td> </tr>'; } echo "</table>"; ?>
No hoh, ei tajunnanvirta toiminut tällä kertaa, ei tietenkään se tapahdu noin. Tottakai niiden vastaavien alkioiden pitää olla samassa taulussa. Noh, mietinpä ensi kerralla hieman pidempään ennenkuin möläyttelen järjettömiä... :)
Sorry, ei toiminut ihan tuolla, mutta muuttamalla tuota näin toimii:
<?php $taulu = file($user_dir); echo "<table>"; //LUETAAN TIEDOT TAULUKKOON //muodostetaan moniulotteinen taulukko tiedostosta for($i=0; $i<count($taulu);$i++){ $users = explode("|",$taulu[$i]); $data_array["Tunnus"][$i]=$users[0]; $mess=file($users[2]); $data_array["Viesteja"][$i]=$mess[0]; $data_array["Oikea_nimi"][$i]=$users[3]; $data_array["Paikkakunta"][$i]=$users[4]; $data_array["Kotisivu"][$i]=$users[5]; $data_array["Sahkoposti"][$i]=$users[6]; } //TEHDÄÄN SORTTAUS array_multisort($data_array['Tunnus'], SORT_ASC,SORT_STRING, $taulu); //TULOSTETAAN for($i=0; $i<count($taulu);$i++){ echo '<tr><td>'.$data_array['Tunnus'][$i].'</td> <td>'. $data_array['Viesteja'][$i].'</td> <td>'. $data_array['Paikkakunta'][$i].'</td> <td>'. $data_array['Kotisivu'][$i].'</td> <td>'. $data_array['Sahkoposti'][$i].'</td> </tr>'; } echo "</table>"; ?>
Edit: Vielä täsmennys: sort pitää olla näin:
<?php array_multisort($data_array['Tunnus'], SORT_ASC,SORT_STRING, $data_array['Viesteja'], $data_array['Paikkakunta'], $data_array['Kotisivu'], $data_array['Sahkoposti'], $taulu); ?>
Kiitoksia paljon neuvoista, jotka auttoi ratkaisuun!
Seuraavaksi alan miettiä, miten tulostaa $data_array["Viesteja"] mukaan, niin että suurin numero on ylimpänä....:)
Millähän parametrillä se onnistuu?
Edit 2: Vieläpä ehdin tätä muokkaamaan.
Sain toimimaan tällä tavalla:
<?php if($_GET["jarjestys"]=="tunnus") { // tulostetaan tunnuksen mukaan array_multisort($data_array['Tunnus'],SORT_STRING, $data_array['Viesteja'], $data_array['Paikkakunta'], $data_array['Kotisivu'], $data_array['Sahkoposti'], $taulu); } if($_GET["jarjestys"]==="viestit") { // tulostetaan viestimäärän mukaan array_multisort($data_array['Viesteja'], SORT_DESC, $data_array['Tunnus'], $data_array['Paikkakunta'], $data_array['Kotisivu'], $data_array['Sahkoposti'], $taulu); } ?>
No vielä viimeinen sana: jos esim. haluaa antaa käyttäjän päättää minkä mukaan sortataan, niin se onnistuu helpommin tuolla minun systeemilläni. Esim tämän toteuttaminen tuolla edellisen viestin systeemillä tuo tuhottomasti turhia koodirivejä.
ajv, tuo näyttää hyvältä. Olen koittanut nyypiönä tehdä jotain tuollaista ja myös jonkinlaisen kyhäelmän onnistuin tekemään :)
Kuinka sitten tehdään tuo sellainen systeemi kuin sinun tuossa esimerkissäsi edellisessä viestissä on?
Eli siis kuinka saadaan tehtyä linkit taulukon ensimmäiselle riville, joista käyttäjä voi valita lajiteltavan sarakkeen? Siis kuten ajv:n esimerkissä: a href="/~k0101030/list_dir.php?sort=name&j=DESC">¿</a>
Mielellään voisin itte kokeilla ja hoksata, jos vain antaisitte hyviä neuvoja, miten lähteä liikkeelle ja mitä ottaa huomioon :D
No nyt näin la-iltana klo 10:n jälkeen ei toi soodaaminen oikeen enään luonnistu, mutta ko. koodin laitoin php-plazaan koodivinkiksi.
http://nwps.ws/~phpplaza/koodi_nayta.php?
Toivottoavasti siitä on jotain apua.
Kiitos paljon koodivinkistä, siitä on varmasti apua! Täytyy tutkiskella tuota esimerkkiä ja koittaa rakennella siitä sopivaa omiin tarkoituksiini!
Aihe on jo aika vanha, joten et voi enää vastata siihen.