Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Tiedosto aakkosjärjestykseen

Sivun loppuun

pistemies [27.05.2004 15:58:30]

#

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?

Olga [27.05.2004 17:00:26]

#

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.

pistemies [27.05.2004 17:27:06]

#

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?

Olga [27.05.2004 17:47:07]

#

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 :)

ajv [27.05.2004 22:02:04]

#

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ä.

pistemies [28.05.2004 00:47:24]

#

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

ajv [28.05.2004 06:54:12]

#

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

  1. Luet datan tiedostosta taulukkoon silmukalla
  2. Sorttaat datan
  3. Sitten vasta tulostat uudella silmukalla

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>";
?>

Olga [28.05.2004 09:13:32]

#

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ä... :)

pistemies [28.05.2004 11:50:16]

#

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);
}
?>

ajv [28.05.2004 14:58:47]

#

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ä.

Cecce [29.05.2004 19:24:38]

#

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&amp;j­=DESC">&iquest;</a>

Mielellään voisin itte kokeilla ja hoksata, jos vain antaisitte hyviä neuvoja, miten lähteä liikkeelle ja mitä ottaa huomioon :D

ajv [29.05.2004 22:15:31]

#

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?list_dir
Toivottoavasti siitä on jotain apua.

Cecce [29.05.2004 23:08:32]

#

Kiitos paljon koodivinkistä, siitä on varmasti apua! Täytyy tutkiskella tuota esimerkkiä ja koittaa rakennella siitä sopivaa omiin tarkoituksiini!


Sivun alkuun

Vastaus

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

Tietoa sivustosta