<?php
error_reporting(E_ALL);
$lines = file('http://nl2n.tribalwars.nl/map/tribe.txt');

echo '<table>';
echo '<tr>';
echo '<td>ID</td><td>Name</td><td>Ally</td><td>Villages</td><td>Points</td><td>Rank</td>';
echo '</tr>';

foreach($lines as $line) {
    list($id, $name, $ally, $villages, $points, $rank) = explode(',', $line);
	sort($points);
    if($ally == '7992') {
        echo '<tr>';
        echo '<td>'.$id.'</td>';
        echo '<td>'.$name.'</td>';
        echo '<td>'.$ally.'</td>';
        echo '<td>'.$villages.'</td>';
        echo '<td>'.$points.'</td>';
        echo '<td>'.$rank.'</td>';    
        echo '</tr>';
    }
}

echo '</table>';
?>


Dit is mijn code. Nu wil ik alles sorteren op $points, maar dit is geen array daardoor werkt de code [func]sort[/func] niet. Mijn vraag dus hoe kan je van gegevens een array kan maken zodat je ik hem dmv sort kan sorteren?

http://www.daanvd.nl//tribalwars.php

Hier kan je zien hoe het eruit komt. Hij pakt het is volgorde zoals het in het txt bestand staat.
Maak een array met de points als keys, en de rest van de waardes als array in de waarde van die keys.

Zo dus:


<?php
error_reporting(E_ALL);
$lines = file('http://nl2n.tribalwars.nl/map/tribe.txt');

echo '<table>';
echo '<tr>';
echo '<td>ID</td><td>Name</td><td>Ally</td><td>Villages</td><td>Points</td><td>Rank</td>';
echo '</tr>';

$sort = array();

foreach($lines as $line) {
    list($id, $name, $ally, $villages, $points, $rank) = explode(',', $line);
    array_push($sort[$points],array($id,$name,$ally,$villages,$rank));
}

ksort($sort,SORT_NUMERIC); //of krsort, dat is omgekeerd, als hij het niet doet even SORT_NUMERIC weghalen

foreach($sort as $k => $v) {
   list($id, $name, $ally, $villages,$rank) = $v;
   $points = $k;
   if($ally == '7992') {
        echo '<tr>';
        echo '<td>'.$id.'</td>';
        echo '<td>'.$name.'</td>';
        echo '<td>'.$ally.'</td>';
        echo '<td>'.$villages.'</td>';
        echo '<td>'.$points.'</td>';
        echo '<td>'.$rank.'</td>';    
        echo '</tr>';
    }
}
echo '</table>';
?> 



Zoiets iig, niet geprobeerd.

[edit]
Het moest ksort() zijn
[/edit]
Dat werkt inderdaad niet. De functie die je wilt gebruiken is array_multisort(). Het nadeel van deze functie is echter dat deze de data in bij elkaar horende data in verschillende array's nodig heeft, alvorens er gesorteerd kan worden.

Je krijg dus array's met respectievelijk id's, namen, ally's, villages, points en ranks. Vervolgens kun je array_multisort() gebruiken om deze data te sorteren en daarna een for loop om de data weer te geven.

Een voorbeeldje van hoe zo'n script eruit zou komen te zien:
<?php
error_reporting(E_ALL);
$aLines = file('http://nl2n.tribalwars.nl/map/tribe.txt');

$aId = array();
$aName = array();
$aAlly = array();
$aVillages = array();
$aPoints = array();
$aRank = array();

foreach($aLines as $iKey => $sLine)
{
list($sId, $sName, $sAlly, $sVillages, $sPoints, $sRank) = explode(',', $sLine);
$aId[$iKey] = $sId;
$aName[$iKey] = $sName;
$aAlly[$iKey] = $sAlly;
$aVillages[$iKey] = $sVillages;
$aPoints[$iKey] = $sPoints;
$aRank[$iKey] = $sRank;
}

array_multisort($aPoints, SORT_DESC, $aId, $aName, $aAlly, $aVillages, $aRank);

for($i = 0; $i = count($aId) - 1; $i++)
{
$aData[$i]['id'] = $aId[$i];
$aData[$i]['name'] = $aName[$i];
$aData[$i]['ally'] = $aAlly[$i];
$aData[$i]['villages'] = $aVillages[$i];
$aData[$i]['points'] = $aPoints[$i];
$aData[$i]['rank'] = $aRank[$i];
}

echo '<pre>'.print_r($aData ,true).'</pre>'; */
?>
Echter gaat dit niet werken omdat het gewoonweg veel te lang duurt om dit script uit te voeren. Je zult hoogstwaarschijnlijk een error krijgen dat de max_execution_time overschreden is. Je hebt namelijk meer dan 27.000 regels in dat txt bestand staan. In zo'n geval wordt sorteren met php lastig, zo niet onmogelijk!

De oplossing is het gebruik van een database. Die kan deze hoeveelheden records makkelijk aan en bovendien kun je records al gesorteerd uit de database halen. Dit scheelt je enorm veel tijd en je script (en dus website) wordt er een stuk sneller van!

Ik kan alles wel in een MySQL tabel zetten, maar het moet dan als je de pagina bezoekt geupdate worden en dat vond ik nog moeilijker.

Idd dit kan gewoon niet: Fatal error: Allowed memory size of 16777216 bytes exhausted (tried to allocate 35 bytes) in /usr/home/xxxxxx/xxxxx/xxxxxxxl/public_html/tribalwars.php on line 14
Mijn scriptje werkt nu iig, maar wat blanche al zegt: met die hoeveelheid data van jouw is sorteren onmogelijk. Je zult alles om moeten zetten naar een database.

Ik krijg iig een error: Allowed memory size... blabla
Hier kan ik het dan in een database zetten en dat het om de minute de database refresht wordt?
Natuurlijk kun je dit alles in een database zetten, maar waarom zou je in hemelsnaam de database om de minuut willen updaten?
het is een lijst met punten. Als deze in de database blijft staan veranderd er toch niets of wel?
Ik denk omdat het een online spel gaat, en hij wil dat iedereen up-to-date is.
Maar om de minuut is niet nodig, weer zo'n geval waarin mensen te snel denken aan een cronjob. Gewoon sorteren als iemand de data opvraagt!
Je kunt gegevens in een database toch gewoon updaten? Dat is zelfs nog veel eenvoudiger dan het updaten van je txt bestand!

Maar ik zien niet in waarom je dit elke minuut zou willen doen...
Oké ik ga even wat proberen.

<?php
error_reporting(E_ALL);
$lines = file('http://nl2n.tribalwars.nl/map/tribe.txt');

foreach($lines as $line) {
list($id, $name, $ally, $villages, $points, $rank) = explode(',', $line);

$name = urldecode($name);
$name = addslashes($name);

mysql_query("INSERT INTO stam SET id='$id', name='$name', ally='$ally', villages='$villages', points='$points', rank='$rank'");
}
?>

Reageren