Arrayinhalt sortieren

fixxxxxi

Erfahrenes Mitglied
Hallo, ich habe mir ein Serverscript gebastelt und möchte nun in der Ausgabe nach dem Wert $data2['score'] absteigend sortieren, so das die höchte Punktzahl oben und die niedrigste unten steht. Natürlich mit den dazugehörigen anderen Werten.

Dafür habe ich bereits arsort($players); probiert. Jedoch wird dabei nicht der Wert beachtet sondern einfach nur nach dem Arrynamen sortiert [0],[1]... usw.

Wie und wo muss ich die Ausgabe sortieren lassen?

Ein zweites Problem was ich habe, und wo ich nicht weiter komme ist, das ich die Score von allen auf dem Server vorhandenem Player addieren möchte. Also den Wert $data2['score'] zusammenfassen. Dafür habe ich bereits array_sum($date2['score']) probiert. Aber auch hier stecke ich fest!

Der Quellcode der PHP sieht folgendermaßen aus:

PHP:
#[...]

// SPECIAL FORCES RESULTS
function print_sf_results($results_sf) 
{
    
    foreach ($results_sf as $id => $data_sf) {
        print_sf_table($data_sf);
    }

}

#[...]

// SF PRINTTABLE

function print_sf_table($data) {

    if (!$data['gq_online']) {
        printf("<p>Der Server antwortet nicht.</p>\n");
        return;
    }

if(!empty($data['players'])){
$players = $data['players'];
}

$sf_info = ''; 

 if(!empty($players)) 
  
{ arsort($players);
 foreach ($players AS $data2) 
   {
   
   if ($data2['player']=='hermit!f!XxXxXi')
   $player='<a href="http://hermitcrew.de/index.php?user-details-1" target="_blank">hermit!f!XxXxXi</a>';
   elseif ($data2['player']=='hermit!SuNnY')
   $player='<a href="http://hermitcrew.de/index.php?user-details-96" target="_blank">hermit!SuNnY</a>';
   elseif ($data2['player']=='hermit!maZe')
   $player='<a href="http://hermitcrew.de/index.php?user-details-48" target="_blank">hermit!maZe</a>';   
   elseif ($data2['player']=='hermit!Tyr0n')
   $player='<a href="http://hermitcrew.de/index.php?user-details-212" target="_blank">hermit!Tyr0n</a>';   
   elseif ($data2['player']=='hermit!Nadra')
   $player='<a href="http://hermitcrew.de/index.php?user-details-2" target="_blank">hermit!Nadra</a>';     
   elseif ($data2['player']=='hermit!Sp1key`|nRw')
   $player='<a href="http://hermitcrew.de/index.php?user-details-102" target="_blank">hermit!Sp1key</a>';    

   else $player=$data2['player'];
                              
   if ($data2['team']=='1') 
   $sf_info = '<tr><td class="bread">'.$player.'</td><td class="bread"><span title="Kills:'.$data2['frags'].', Deaths:'.$data2['deaths'].', Ping:'.$data2['ping'].'">[Score:'.$data2['score'].']</span></td><tr>';

   if ($data2['team']=='0') 
   $sf_info = '';
      

echo $sf_info;


   } }else echo 'Kein Special online!'; }

#[...]

  //SF AUSGEBEN
  echo '<tr><td class="bread"><b>Special Forces</b><br>';  
   print_sf_results($results_sf);  
    echo '</td></tr><td class="bread"><br><br></td></tr>';
 
Wenn ich dich richtig verstanden habe, hasst du die Daten in einem 2-Dimensionalen Array liegen.

Beide Lösunfen habe ich gerade vor einer Stunde in meinem Wikki zusammengetragen *g*
- Sortieren nach einem Wert in einer 2-Dimensionaeln Array (ggf in der Funktion usort durch ursort ersetzen um absteigend zu sortieren)
- Summe eines Feldes eines 2 Dimensionalen Feldes
http://wiki.yaslaw.info/wikka/PhpArraySchnipsel
 
Danke für die schnelle Antwort... Nur weiß ich nicht an welcher Stelle ich das Sortieren machen soll, denn $data2 ist ja der Wert des einzelnen Spielers und $player der erste Wert, des "Oberarrays".

Ich habs nun so probiert:

PHP:
// TER PRINTTABLE

function print_ter_table($data) {

    if (!$data['gq_online']) {
        printf("<p>Der Server antwortet nicht.</p>\n");
        return;
    }


if(!empty($data['players'])){
$players = $data['players'];
}


$terr_info = '';

 if(!empty($players)) 

{ 

 foreach ($players AS $data2) 
   {

   //hier wird sortiert
   function sortBy(&$data2, $sortBy){
    usort($data2, create_function('$a, $b', "return strcmp(\$a['{$sortBy}'], \$b['{$sortBy}']);"));    
   }
   sortBy($data2, 'score');
   //sotieren ende
 
   if ($data2['player']=='hermit!f!XxXxXi')
   $player='<a href="http://hermitcrew.de/index.php?user-details-1" target="_blank">hermit!f!XxXxXi</a>';
   elseif ($data2['player']=='hermit!SuNnY')
   $player='<a href="http://hermitcrew.de/index.php?user-details-96" target="_blank">hermit!SuNnY</a>';
   elseif ($data2['player']=='hermit!maZe')
   $player='<a href="http://hermitcrew.de/index.php?user-details-48" target="_blank">hermit!maZe</a>';   
   elseif ($data2['player']=='hermit!Tyr0n')
   $player='<a href="http://hermitcrew.de/index.php?user-details-212" target="_blank">hermit!Tyr0n</a>';   
   elseif ($data2['player']=='hermit!Nadra')
   $player='<a href="http://hermitcrew.de/index.php?user-details-2" target="_blank">hermit!Nadra</a>';     
   elseif ($data2['player']=='hermit!Sp1key`|nRw')
   $player='<a href="http://hermitcrew.de/index.php?user-details-102" target="_blank">hermit!Sp1key</a>';    

   else $player=$data2['player'];
 
   if ($data2['team']=='0') 
   $terr_info = '<tr><td class="bread">'.$player.'</td><td class="bread"><span title="Kills:'.$data2['frags'].', Deaths:'.$data2['deaths'].', Ping:'.$data2['ping'].'">[Score:'.$data2['score'].']</span></td><tr>';
   if ($data2['team']=='1') 
   $terr_info = ''; 



echo $terr_info; 

   } }else echo 'Kein Terror online!'; }

Jedoch kann da irgendwas nicht stimmen denn mehr als ne Fehlermeldung kommt nicht bei raus!

Notice: Undefined index: player in /home/www/hermitcrew/mainpage/include/contents/selfbp/selfp/viewerto.php on line 326
Notice: Undefined index: player in /home/www/hermitcrew/mainpage/include/contents/selfbp/selfp/viewerto.php on line 328
Notice: Undefined index: player in /home/www/hermitcrew/mainpage/include/contents/selfbp/selfp/viewerto.php on line 330
Notice: Undefined index: player in /home/www/hermitcrew/mainpage/include/contents/selfbp/selfp/viewerto.php on line 332
Notice: Undefined index: player in /home/www/hermitcrew/mainpage/include/contents/selfbp/selfp/viewerto.php on line 334
Notice: Undefined index: player in /home/www/hermitcrew/mainpage/include/contents/selfbp/selfp/viewerto.php on line 336
Notice: Undefined index: player in /home/www/hermitcrew/mainpage/include/contents/selfbp/selfp/viewerto.php on line 339

Notice: Undefined index: team in /home/www/hermitcrew/mainpage/include/contents/selfbp/selfp/viewerto.php on line 341
Notice: Undefined index: team in /home/www/hermitcrew/mainpage/include/contents/selfbp/selfp/viewerto.php on line 343

Fatal error: Cannot redeclare sortby() (previously declared in /home/www/hermitcrew/mainpage/include/contents/selfbp/selfp/viewerto.php:320) in /home/www/hermitcrew/mainpage/include/contents/selfbp/selfp/viewerto.php on line 320
 
Zuletzt bearbeitet:
Und würdest du uns diese Fehlermeldung auch noch zeigen, könnten wir dir unter Umständen auch noch helfen.


e:/ Wurde ja bereits editiert. Somit diesen Post erstmal ignorieren ;)


e2:/ Die Fehlermeldung sagt dir, dass du den falschen Index benutzt. Dann schaut man nach oben und stellt fest, dass man vorher $data2['players'] geschrieben hat und nicht $data2['player']. Also einfach umändern.

e3:/ Zeig doch mal wie dein Array $data2 aufgebaut ist. Einfach mal ein print_r($data2) setzten. Dann kann man den Fehler leichter finden. Mir ist gerade aufgefallen, dass du ja players in die Foreachschleife übernimmst.
 
Zuletzt bearbeitet:
Hab die Funktion grad noch verbessert.....

Die Funktion sortBy() solltest du nicht in der Schleife drin haben. die Kannst du ganz oben im Code einmal definieren.

Wie sieht denn dien $data aus? Mach doch mal ein var_dump($data); und poste hier eine abgeaspeckte Version davon. Ab deinem Code werd ich nur mühsam schlau
 
var_dump($data) gibt folgendes aus:

PHP:
array(38) { ["hostname"]=>  string(39) ".pl Polskie Podziemie AK* Multi-Host.pl" ["hostport"]=>  string(4) "3515" ["maptitle"]=>  string(14) "Deadly Drought" ["mapname"]=>  string(10) "TO-Drought" ["gametype"]=>  string(5) "TO350" ["numplayers"]=>  string(2) "13" ["maxplayers"]=>  string(2) "16" ["gamemode"]=>  string(11) "openplaying" ["gamever"]=>  string(3) "436" ["minnetver"]=>  string(3) "400" ["password"]=>  string(5) "False" ["queryid"]=>  string(4) "51.1" ["gamename"]=>  string(2) "ut" ["location"]=>  string(1) "0" ["players"]=>  array(13) { [0]=>  array(6) { ["player"]=>  string(15) "[CHzO]matek.osd" ["frags"]=>  string(1) "1" ["deaths"]=>  string(1) "1" ["score"]=>  string(1) "0" ["ping"]=>  string(2) "62" ["team"]=>  string(1) "1" } [1]=>  array(6) { ["player"]=>  string(7) "puncior" ["frags"]=>  string(1) "0" ["deaths"]=>  string(1) "1" ["score"]=>  string(1) "0" ["ping"]=>  string(3) "106" ["team"]=>  string(1) "0" } [2]=>  array(6) { ["player"]=>  string(13) "PT-91"JankeS"" ["frags"]=>  string(1) "0" ["deaths"]=>  string(1) "1" ["score"]=>  string(1) "0" ["ping"]=>  string(2) "83" ["team"]=>  string(1) "0" } [3]=>  array(6) { ["player"]=>  string(3) "Bck" ["frags"]=>  string(1) "0" ["deaths"]=>  string(1) "0" ["score"]=>  string(1) "0" ["ping"]=>  string(2) "49" ["team"]=>  string(1) "1" } [4]=>  array(6) { ["player"]=>  string(7) "live_:)" ["frags"]=>  string(1) "0" ["deaths"]=>  string(1) "0" ["score"]=>  string(1) "0" ["ping"]=>  string(2) "60" ["team"]=>  string(1) "1" } [5]=>  array(6) { ["player"]=>  string(10) "AK*Duch.pl" ["frags"]=>  string(1) "0" ["deaths"]=>  string(1) "0" ["score"]=>  string(1) "0" ["ping"]=>  string(2) "43" ["team"]=>  string(1) "1" } [6]=>  array(6) { ["player"]=>  string(4) "mekS" ["frags"]=>  string(1) "0" ["deaths"]=>  string(1) "0" ["score"]=>  string(1) "0" ["ping"]=>  string(2) "34" ["team"]=>  string(1) "0" } [7]=>  array(6) { ["player"]=>  string(5) "Bania" ["frags"]=>  string(1) "1" ["deaths"]=>  string(1) "0" ["score"]=>  string(1) "0" ["ping"]=>  string(2) "51" ["team"]=>  string(1) "1" } [8]=>  array(6) { ["player"]=>  string(5) "borys" ["frags"]=>  string(1) "0" ["deaths"]=>  string(1) "0" ["score"]=>  string(1) "0" ["ping"]=>  string(2) "46" ["team"]=>  string(1) "1" } [9]=>  array(6) { ["player"]=>  string(6) "miszcz" ["frags"]=>  string(1) "0" ["deaths"]=>  string(1) "0" ["score"]=>  string(1) "0" ["ping"]=>  string(2) "38" ["team"]=>  string(1) "0" } [10]=>  array(6) { ["player"]=>  string(5) "ympk!" ["frags"]=>  string(1) "1" ["deaths"]=>  string(1) "0" ["score"]=>  string(1) "0" ["ping"]=>  string(2) "41" ["team"]=>  string(1) "1" } [11]=>  array(6) { ["player"]=>  string(13) "Bejca.osd@mp3" ["frags"]=>  string(1) "1" ["deaths"]=>  string(1) "0" ["score"]=>  string(1) "0" ["ping"]=>  string(2) "42" ["team"]=>  string(1) "0" } [12]=>  array(6) { ["player"]=>  string(4) "nobo" ["frags"]=>  string(1) "0" ["deaths"]=>  string(1) "1" ["score"]=>  string(1) "0" ["ping"]=>  string(2) "92" ["team"]=>  string(1) "0" } } ["listenserver"]=>  string(5) "False" ["timelimit"]=>  string(2) "20" ["minplayers"]=>  string(1) "0" ["changelevels"]=>  string(4) "True" ["maxteams"]=>  string(1) "2" ["balanceteams"]=>  string(5) "False" ["playersbalanceteams"]=>  string(5) "False" ["friendlyfire"]=>  string(3) "10%" ["tournament"]=>  string(5) "False" ["gamestyle"]=>  string(8) "Hardcore" ["explositionff"]=>  string(5) "False" ["tostversion"]=>  string(12) "TOST 4.4.1.9" ["protection"]=>  string(19) "ESE Support 0.3.8.3" ["esemode"]=>  string(8) "optional" ["cwmode"]=>  string(5) "False" ["outdated"]=>  string(4) "true" ["AdminName"]=>  string(8) "AK*Damek" ["AdminEMail"]=>  string(23) "www.armiakrajowa.ubf.pl" ["gq_online"]=>  bool(true) ["gq_address"]=>  string(13) "195.114.0.209" ["gq_port"]=>  string(4) "3516" ["gq_prot"]=>  string(7) "gamespy" ["gq_type"]=>  string(11) "tacticalops" }
 
Ich denke ein print_r von $data2 hätte gereicht, $data ist mir doch etwas groß.

Ich lese daraus, dass 'player' zumindest existiert.
 
Ich denke ein print_r von $data2 hätte gereicht, $data ist mir doch etwas groß.

Und nach dem Wert [score] => X soll sortiert werden.

PHP:
Array ( [player] => live_:) [frags] => 2 [deaths] => 1 [score] => 5 [ping] => 60 [team] => 1 ) Array ( [player] => kSd||Scream [frags] => 0 [deaths] => 1 [score] => 0 [ping] => 44 [team] => 1 ) Array ( [player] => borys [frags] => 1 [deaths] => 2 [score] => 17 [ping] => 44 [team] => 1 ) Array ( [player] => [CHzO]matek.osd [frags] => 2 [deaths] => 1 [score] => 11 [ping] => 44 [team] => 0 ) Array ( [player] => PT-91"JankeS" [frags] => 0 [deaths] => 2 [score] => 2 [ping] => 62 [team] => 0 ) Array ( [player] => Bck [frags] => 0 [deaths] => 2 [score] => 16 [ping] => 48 [team] => 1 ) Array ( [player] => Bania [frags] => 2 [deaths] => 1 [score] => 30 [ping] => 51 [team] => 1 )
 
Zuletzt bearbeitet:
nönö. $data ist schon gut.
Hab mal schenll eine Test geschrieben (und meine Funktion erweitert..)

PHP:
//Simulieren der Daten
$data = array(
array( 
    'player' => 'live_:)', 
    'frags' => '2', 
    'deaths' => '1', 
    'score' => '5', 
    'ping' => '60', 
    'team' => '1'),
array(
    'player' => 'kSd||Scream', 
    'frags' => '0', 
    'deaths' => '1', 
    'score' => '0', 
    'ping' => '44', 
    'team' => '1'), 
array(
    'player' => 'borys', 
    'frags' => '1', 
    'deaths' => '2', 
    'score' => '17', 
    'ping' => '44', 
    'team' => '1')
);


/**
 * mpl      by ERB software
 * @author  stefan.erb(at)erb-software.com
 * @since   PHP 5.2
 * Sortiert einen 2-Dimensionalen Array nach einem Key in der 2ten Dimension
 * @param $array        Array der sortiert wird
 * @param $key          Key im Array der sortiert werden soll (key oder index)
 * @param $direction    Sortierrichtung. ASC oder DESC
 * @param $sort_flags   SORT_REGULAR, SORT_STRING, SORT_NUMERIC. Siehe sort_flags-Parameter von sort()
 */
function sortBy(&$array, $key, $direction = 'ASC', $sort_flags = SORT_REGULAR){
    $factor = ($direction == 'DESC') ? -1 : 1;
    if(is_numeric($key)){
        $convert = '$a = array_values($a); $b = array_values($b);';
        $a = "\$a[{$key}]";     $b = "\$b[{$key}]";
    } else {
        $convert = "";
        $a = "\$a['{$key}']";   $b = "\$b['{$key}']";
    }
    switch($sort_flags){  
        case SORT_NUMERIC:
            $function = "({$a} == {$b}) ? 0 : ({$a} > {$b}) ? -1 : 1";
            break;       
        case SORT_REGULAR:
        case SORT_STRING:
        default: 
            $function = "strcmp({$a}, {$b})";
    }
    $function = "{$convert} return $factor * ($function);"; 
    return usort($array, create_function('$a, $b', $function));    
}


//sortieren nach score absteigend
sortBy($data, 'score', 'DESC', SORT_NUMERIC);

foreach($data as $players){
    echo "{$players['player']}:   {$players['team']} -> {$players['score']} <br />";
}

Ergibt die folgende Ausgabe
Code:
borys: 1 -> 17
live_:): 1 -> 5
kSd||Scream: 1 -> 0

Und die Summe ist einfach
PHP:
$sum = array_sum(array_map(create_function('$e', 'return $e["score"];'), $data));
 
Zuletzt bearbeitet:
Schonmal riesen Dank! Ein Teilerfolg ist zu sehen :p

Mit der Funktion vorweg und dann mit

PHP:
//sortieren nach score absteigend
sortBy($players, 'score', 'ASC', SORT_NUMERIC);

an statt

PHP:
//sortieren nach score absteigend
sortBy($data, 'score', 'ASC', SORT_NUMERIC);

werden die Spieler nach Score sortiert. Nur mit dem zusammenaddieren der Spieler komm ich nicht vorran...

$sum_sf = array_sum(array_map(create_function('$e', 'return $e["score"];'), $players));
echo 'SF Gesamtpunktzahl:'.$sum_sf.''

Damit wird zumindest die Punktezahl addiert und ausgegeben. Jedoch werden alle Punkte aller Spieler addiert und nicht nur des jeweiligen Teams.

Gibt es sowas in der Arte wie bei SQL "array_sum...WHERE $players($data2)[team]=1"
 

Neue Beiträge

Zurück