Array sortieren

FBIagent

Erfahrenes Mitglied
Moin,

wie im Betreff schon gesagt möchte ich ein Array sortieren.

Hier erstmal der code:
PHP:
$clans_array = array();
$count = 0;
while($row_clan=mysql_fetch_array($res_clans))
{
  $res_members = @mysql_query("SELECT `char_name` FROM `characters` WHERE `clanid`=".$row_clan['clan_id']);
  $res_leader = @mysql_query("SELECT `char_name` FROM `characters` WHERE `obj_id`=".$row_clan['leader_id']);
  while($leader_row=@mysql_fetch_array($res_leader))
  {
    $clan_members = @mysql_num_rows($res_members) - 1;
    $clans_array[$count] = array('name'=>$row_clan['clan_name'],'members'=>$clan_members,'leader'=>$leader_row['char_name']);
  }
  $count++;
}
echo "<table border='1'><tr><th><center>Clans</center></th><th><center>Members</center></th><th><center>Leader</center></th></tr>";
sort($clans_array, SORT_NUMERIC);
for($i=0;$i>$count;$i++)
{ 
  echo "<tr><td><center>".$clans_array[$i]['name']."</center></td><td><center>".$clans_array[$i]['members']." Member(s)</center></td><td><center>".$clans_array[$i]['leader']."</center></td></tr>";
} 
echo "</table>";

Das Array $clans_array soll nach "members" geordnet werden leiden komme ich
nicht weiter als das was ich bis jetzt versucht habe. Natürlich habe ich auch schon
andere Sachen ausprobiert hatte aber leider keinen Erfolg.

Währe euch sehr verbunden wenn ihr mir damit helfen könntet.

Danke im Vorraus
MFG FBIagent
 
Das Array scheint bei
PHP:
$clans_array[$count] = array('name'=>$row_clan['clan_name'],'members'=>$clan_members,'leader'=>$leader_row['char_name']);
garkeinen Wert zu bekommen... habe das mal ganz ohne sortieren gemacht und dabei
kam keine Ausgabe heraus... Ich wüsste jetzt nicht wirklich was da falsch sein sollte
:confused:

THX im Vorraus
MFG FBIagent
 
Steht denn überhaupt was in den Variablen wie $row_clan['clan_name'] Sprich ist die SQL Abfrage korrekt und werden Daten auch ausgelesen? durch die @ Zeichen unterdrückst du ja jegliche Fehlermeldungen.
Wenn schon Fehler bei der SQL Abfrage vorhanden sind, würde ich mir diese per mysql_error(); detailierter ausgeben lassen.

Rechtschreibfehler o. ä. sind mir nicht aufgefallen.
Achja, bevor du das Array sortierst kannst du auch als Kontroll- und Abfrageautomatik ein
PHP:
echo "<pre>";
echo var_dump($clans_array);
echo "</pre>";
einsetzen und der Inhalt des Arrays wird dir strukturiert aufgelistet (dump).

Gruss
 
Die MySQL Anfragen sollten kein Problem darstellen schließlich habe ich vorher die Daten
direkt ausgeben:

PHP:
<?php

function con_error($msg)
{
  echo $msg;
  @mysql_close();
  die();
}

$host = "127.0.0.1";
$usr = "root";
$pwd = "";
$db = "l2_game";

$mysql_con = mysql_connect($host,$usr,$pwd);
if(!$mysql_con)
  con_error("Database server is down at the moment. Please try again later!");

$db_con = mysql_select_db($db);
if(!$db_con)
  con_error("An error has Occured. Please inform the admin!");

$res_clans = mysql_query("SELECT * FROM `clan_data`");
if(!$res_clans)
  con_error("<br><br>There are no clans on this server");

echo "<table border='1'><tr><th><center>Clans</center></th><th><center>Members</center></th><th><center>Leader</center></th></tr>";
while($row_clan=mysql_fetch_array($res_clans))
{
  $res_members = @mysql_query("SELECT `char_name` FROM `characters` WHERE `clanid`=".$row_clan['clan_id']);
  $res_leader = @mysql_query("SELECT `char_name` FROM `characters` WHERE `obj_id`=".$row_clan['leader_id']);
  while($leader_row=@mysql_fetch_array($res_leader))
  {
    $clan_members = @mysql_num_rows($res_members) - 1;
    echo "<tr><td><center>".$row_clan['clan_name']."</center></td><td><center>".$clan_members." Member(s)</center></td><td><center>".$leader_row['char_name']."</center></td></tr>";

  }
}
echo "</table>";
mysql_close();

?>
 
Zuletzt bearbeitet:
Ich habe es letztendlich hinbekommen... hier der Code:

PHP:
<?php 
function con_error($msg) 
{ 
  echo $msg; 
  @mysql_close(); 
  die(); 
}
 
function cmp($a,$b) {
  return strcmp($b[1], $a[1]);
}
 
$host = "127.0.0.1"; // MySQL Host/IP eintragen
$usr = "root"; // MySQL Serveruser eintragen
$pwd = ""; // MySQL nutzer Passwort
$db = "l2_game"; // Datenbankname eintragen
 
$mysql_con = mysql_connect($host,$usr,$pwd); 
if(!$mysql_con) 
  con_error("Database server is down at the moment. Please try again later!"); 
 
$db_con = mysql_select_db($db); 
if(!$db_con) 
  con_error("An error has Occured. Please inform the admin!"); 
 
$res_clans = mysql_query("SELECT * FROM `clan_data`"); 
if(!$res_clans) 
  con_error("<br><br>There are no clans on this server"); 
 
$clans_array = array();
$count = 0;
echo "<table border='1'><tr><th><center>Clans</center></th><th><center>Members</center></th><th><center>Leader</center></th></tr>";

while($row_clan=mysql_fetch_array($res_clans)) 
{ 
  $res_members = @mysql_query("SELECT `char_name` FROM `characters` WHERE `clanid`=".$row_clan['clan_id']); 
  $res_leader = @mysql_query("SELECT `char_name` FROM `characters` WHERE `obj_id`=".$row_clan['leader_id']); 
  while($leader_row=@mysql_fetch_array($res_leader)) 
  { 
    $clan_members = @mysql_num_rows($res_members) - 1; 
    $clans_array[$count][0] = $row_clan['clan_name'];
    $clans_array[$count][1] = $clan_members;
    $clans_array[$count][2] = $leader_row['char_name'];
  }
  $count++;
}

usort($clans_array,"cmp");
foreach($clans_array as $key => $clan_array)
  echo "<tr><td><center>".$clan_array[0]."</center></td><td><center>".$clan_array[1]." Member(s)</center></td><td><center>".$clan_array[2]."</center></td></tr>";
echo "</table>"; 
mysql_close(); 
?>

Und nochmal danke für die Hilfe.
MFG FBIagent
 
Habe jetzt doch noch ein Problem habe jetzt folgendes:
PHP:
<?php

function con_error($msg) 
{ 
  echo $msg; 
  @mysql_close(); 
  die(); 
} 

function cmp($a,$b) {
  return strcmp($b[1],$a[1]);
}

$host = "localhost";
$usr = "";
$pwd = "";
if($db==1)
  $db = "l2_low_new";
if($db==2)
  $db = "l2_high_new"; 

$mysql_con = mysql_connect($host,$usr,$pwd); 
if(!$mysql_con) 
  con_error("Database server is down at the moment. Please try again later!"); 

$db_con = mysql_select_db($db); 
if(!$db_con) 
  con_error("An error has occured. Please inform the admin! Error: Database not found!"); 

$res_clans = mysql_query("SELECT * FROM `clan_data`"); 
if(!$res_clans) 
  con_error("<br><br>There are no clans on this server"); 
else
  $clans_count = @mysql_num_rows($res_clans);

$clans_array = array();
$count = 0;

while($row_clan=@mysql_fetch_array($res_clans)) 
{ 
  $res_members = @mysql_query("SELECT `char_name` FROM `characters` WHERE `clanid`=".$row_clan['clan_id']); 
  $res_leader = @mysql_query("SELECT `char_name` FROM `characters` WHERE `obj_id`=".$row_clan['leader_id']); 
  while($leader_row=@mysql_fetch_array($res_leader)) 
  { 
    $members_count = @mysql_num_rows($res_members) - 1; 
    $clans_array[$count][0] = $row_clan['clan_name'];
    $clans_array[$count][1] = $members_count;
    $clans_array[$count][2] = $leader_row['char_name'];
  }
  $count++;
}

usort($clans_array,"cmp");
echo "<center><h5>".$clans_count." clan(s) registered</h5>";
echo "<table border='1'><tr><th><center>Ranking</center></th><th><center>Clans</center></th><th><center>Members</center></th><th><center>Leader</center></th></tr>";
$ranking = 1;

foreach($clans_array as $clan_array)
{
  echo "<tr><td><center>".$ranking."</center></td><td><center>".$clan_array[0]."</center></td><td><center>".$clan_array[1]." Member(s)</center></td><td><center>".$clan_array[2]."</center></td></tr>";
  $ranking++;
  if($ranking>=101)
    break;
}

echo "</table></center>";
mysql_close();
die();
?>

Nehmen wir an ich habe 10 Clans mit folgenden Memberzahlen:
Code:
Clan  1: 1
Clan  2: 2
Clan  3: 3
Clan  4: 19
Clan  5: 29
Clan  6: 39
Clan  7: 4
Clan  8: 5
Clan  9: 49
Clan 10: 59

Dann bekomme ich diese Werte wie folgt sortiert:
Code:
Clan 10: 59
Clan  8: 5
Clan  9: 49
Clan  7: 4
Clan  6: 39
Clan  3: 3
Clan  5: 29
Clan  2: 2
Clan  4: 19
Clan  1: 1

Ich möchte es aber so geordned haben:
Code:
Clan 10: 59
Clan  9: 49
Clan  6: 39
Clan  5: 29
Clan  4: 19
Clan  8: 5
Clan  7: 4
Clan  3: 3
Clan  2: 2
Clan  1: 1

Wie soll ich das jetzt anstellen?

THX im Vorraus
MFG FBIagent
 
Zuletzt bearbeitet:
Du vergleichst die Werte als String und da ist die Sortierung richtig.
Stelle mit $intWert=(int)$evtlString sicher, dass Du Zahlen vergleichst und halte Dich beim Vergleich an die Beispiele zu [phpf]usort[/phpf] aus dem Handbuch.

Gruß hpvw
 
Tut mir leid ich weis jetzt ned wirklich genau was du meinst könntest du das vieleicht
etwas umschreiben und ein kleines Beispiel geben währe echt nett.

THX im Vorraus
MFG FBIagent
 
hpvw meint, dass du die zu vergleichenden Werte vorher zum Integer (Ganzzahl)-Typ "casten sollst". Auch wenn PHP eine Skriptsprache mit automatischer Typumwandlung ist, hilft das bei Problemstellungen wie deiner nicht weiter.
PHP:
$clans_array[$count][1] = (int)$members_count;

Behandelt PHP deine Clanmitgliederanzahl als String, kommt z.B. 10 vor 2-9, weil das erste Zeichen 1 ja auch vor allen anderen Ziffern außer 0 kommt. Setzt du (int) davor, wird der Wert als Zahl behandelt, 10 ist also größer als 9 und wird dementsprechend sortiert.
 
Zurück