Autor Zpráva
Vojko
Profil
Dobrý deň,

chcel by som sa spýtať. Mám script, ktorý číta údaje z XML.
Potrebujem ale, aby nevypisoval údaje po jednom, ale potrebujem, aby sčítaval tie údaje.
Takto to vypadá teraz: http://www.cg.vojko.eu/tabulka-hlas.php
Potrebujem, aby to každé meno sčítalo a hodilo číslo, koľko krát hlasoval.

Tu je kód:

    <?php
    // Extracts content from XML tag
     
    function GetElementByName ($xml, $start, $end) {
     
        global $pos;
        $startpos = strpos($xml, $start);
        if ($startpos === false) {
            return false;
        }
        $endpos = strpos($xml, $end);
        $endpos = $endpos+strlen($end);    
        $pos = $endpos;
        $endpos = $endpos-$startpos;
        $endpos = $endpos - strlen($end);
        $tag = substr ($xml, $startpos, $endpos);
        $tag = substr ($tag, strlen($start));
     
        return $tag;
     
    }
     
    // Open and read xml file. You can replace this with your xml data.
     
    $file = "http://www.czech-craft.eu/xml/230.xml";
    $pos = 0;
    $Nodes = array();
     
    if (!($fp = fopen($file, "r"))) {
        die("Nemohu nacist XML soubor (spatna cesta nebo opravneni?)");
    }
    while ($getline = fread($fp, 4096)) {
        $data = $data . $getline;
    }
     
    $count = 0;
    $pos = 0;
     
    // Goes throw XML file and creates an array of all <XML_TAG> tags.
    while ($node = GetElementByName($data, "<hlas>", "</hlas>")) {
        $Nodes[$count] = $node;
        $count++;
        $data = substr($data, $pos);
    }
     
    //samotny vypis udaju do tabulky jako priklad
    echo "<html><head></head><body>";
    echo "<table border=\"2\">";
    // Gets infomation from tag siblings.
    for ($i=0; $i<$count; $i++) {
    echo "<tr>";
      echo "<td>";
        echo GetElementByName($Nodes[$i], "<id>", "</id>");
      echo "</td>";
      echo "<td>";
        echo GetElementByName($Nodes[$i], "<nick>", "</nick>");
      echo "</td>";
      echo "<td>";
        echo GetElementByName($Nodes[$i], "<cas>", "</cas>");
      echo "</td>";
      echo "<td>";
        echo GetElementByName($Nodes[$i], "<ip>", "</ip>");
      echo "</td>";
    echo "</tr>";
    }
    echo "</table></body></html>";
    ?>

Ďakujem za každú radu.
Darker
Profil
Děláš to nějak složitě. PHP má integrované funkce na čtení XML souborů, které tyhle soubory převedou na objekt.
Tagy potom procházíš takhle:
$xml->{"jmeno"}[$poradi];
/*nebo*/
$xml->jmeno[$poradi]
V tvém případě tedy:
for(/*...*/) {
  $xml->hlas[$i]
}
Pokud chceš ukládat údaje o počtu hlasování vytvoř si pro každé jméno/ID klíč v asociativním poli a tam potom přičítej:
$hlasy = array();
for($i=0;$i<count($xml->hlas);$i++)
  $hlas = $xml->hlas[$i];
  if(isset($hlasy[(string)$hlas->nick]))  //Zjišťuje zda už v poli existuje položka se jménem uživatele (např.: $hlasy["pepa"])
     $hlasy[(string)$hlas->nick]++;       //Uživatel už má záznam - přičteme 1
  else 
     $hlasy[(string)$hlas->nick]=1;       //Vytvoříme nový záznam o tomto uživateli - zatím má 1 hlas
}
Každopádně pokud je to možné, doporučuji hlasování řešit pomocí DATABÁZE.
Vojko
Profil
Nó to hlasovanie cez Databázu nemám ako riešiť, keďže je to hlasovanie na inom webe, takže to ja moc neovplyvním :/

Chcel by som ťa poprosiť, či by si mi neposlal celý script ako má byť, pretože moc som tomu nepochopil, ako to mám pozliepať :D
juriad
Profil
základ by vypadal asi takto (otestované):
<?php

$file = "http://www.czech-craft.eu/xml/230.xml";
if (!($fp = fopen($file, "r"))) {
    die("Nemohu nacist XML soubor (spatna cesta nebo opravneni?)");
}

$data = "";
while ($getline = fread($fp, 4096)) {
    $data = $data . $getline;
}

$hlasy = array();

$xml = simplexml_load_string($data);
foreach($xml->hlas as $hlas) {
    $nick = (string) $hlas->nick;
    if(array_key_exists($nick, $hlasy)) {
        $hlasy[$nick]++;
    } else {
        $hlasy[$nick] = 1;
    }
}

echo "<html><head></head><body>";
echo "<table border=\"2\">";
echo "<tr><th>Nick</th><th>Pocet</th></tr>";
foreach($hlasy as $nick => $pocet) {
    echo "<tr>";
    echo "<td>$nick</td><td>$pocet</td>";
    echo "</tr>";
}
echo "</table>";
echo "</body></html>";
Darker
Profil
Vojko:
Vzhledem k tomu, že jsem netušil, že panther nerozumí ironii a můj předchozí příspěvek bude přesunut (U ledu>Kontejner), řeknu to takhle: To co jsem napsal výše k sestavení skriptu co potřebuješ stačí. Pokud chceš aby za tebe někdo udělal tvojí práci popros kamaráda (třeba toho co za tebe udělal původní skript) nebo zaplať.
Vojko
Profil
Ďakujem veľmi pekne juriad, a nevedel by si mi nejako poradiť, ako to spravím aby to išlo od najväčšieho počtu hlasov po najmenší ?
Darker prepáč, ale tomu som nerozumel čo si mi napísal ako odpoveď.
Slušne som požiadal o radu, nikoho som nenútil aby mi tu niekto niečo spravil.
Som rád, že juriad mi odpísal a aj ty.
Ako hovorím, keby niekto neodpisoval, určite nebudem zakladať ďalšie témy s tým istým problémom.

Ďakujem za pochopenie a Vašu pomoc.
juriad
Profil
na řádek 24 přidej:
arsort($hlasy);
Vojko
Profil
Ďakujem veľmi pekne :)

Prajem príjemný zvyšok dňa.

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: