Seite 1 von 1
multidimensionales Array nur zum Teil beschreiben lassen
Verfasst: 20.11.2004 00:42
von Gumfuzi
Hallo Leute,
Ich habe zwei getrennte Schleifen. In jeder Schleife wird ein Teil des multidimensionalen Arrays definiert.
Beispiel:
1. Schleife:
$array1[Name1] = 10 (=10 Euro)
2. Schleife:
$array2[Name1] = 5 (=5 Taler)
Nun soll aber ein Array daraus werden.
Entweder man kann anstelle des normalen Arrays ein multidimensionales Array machen, wo immernur ein Teil des Array pro Schleife beschrieben wird, oder man fügt die Arrays anhand der Schlüssel zusammen.
Aber wie?
Verfasst: 20.11.2004 03:04
von D@ve
Ganz verstanden habe ich das nicht...
Entweder so:
Code: Alles auswählen
$anzahl = 7;
for ($i = 0; $i < $anzahl; $i++)
{
my_array[1][$i] = 10;
my_array[2][$i] = 5;
}
Oder verschachtelt
Code: Alles auswählen
$anzahl_aussen = 7;
$anzahl_innen = 7;
for ($i = 0; $i < $anzahl_aussen; $i++)
{
for ($j = 0; $j < $anzahl_innen; $j++)
{
my_array[$i][$j] = 10;
}
}
Gruß, Dave
Verfasst: 20.11.2004 09:42
von Gumfuzi
OK, da habe ich mich wohl etwas ungeschickt ausgedrückt - sorry.
Ich meinte das so:
Es soll ein Array geben, daß in etwa so aussehen soll
Key, Wert1, Wert2
...
Ich habe programmtechnisch aber für "Wert1" und "wert2" je eine eigene Schleife an unterschiedlichen Stellen des Programmcodes.
Nun war mein Gedanke, daß ich in der ersten Schleife nur den Array mit "key" und "Wert1" beschreibe und den "Wert2" dabei unverändert lasse.
In der zweiten Schleifen (später im Codeteil) soll dann nur mehr "key" und "Wert2" beschrieben werden und dabei der "Wert1" unverändert bleiben.
Dieses fertige Array sollte dann mit einer Schleife in die Template übertragbar sein, sodaß alle Elemente in einer Tabelle ausgegeben werden können.
Verfasst: 20.11.2004 10:09
von Gumfuzi
Ich habe es nun so probiert:
in der ersten Schliefe:
Code: Alles auswählen
$array = array($row['highscore_player']=>array($row['Anzahl']=>0));
in der 2. Schleife:
Code: Alles auswählen
$array = array($key=>array(current($array[$key])=>$val));
Hier der ganze Codeteil (für den besseren Überblick):
Code: Alles auswählen
$sql='SELECT highscore_player, Count(*) AS Anzahl FROM `phpbb_ina_highscore` WHERE `highscore_mon` = ' . date("m", time()) . ' AND `highscore_year` = ' . date("Y", time()) . ' GROUP BY highscore_player';
if(!$result = $db->sql_query($sql)) {
message_die(GENERAL_ERROR, 'Fehler beim Auslesen der HiScore-Informationen', '', __LINE__, __FILE__, $sql);
}
while($row = $db->sql_fetchrow($result))
{
$template->assign_block_vars('test', array(
'MON_NAME' => $row['highscore_player'],
'MON_ANZ' => $row['Anzahl']
));
$mon[$row['highscore_player']] = $row['Anzahl'];
$array = array($row['highscore_player']=>array($row['Anzahl']=>0));
}
$sql = "SELECT * FROM " . iNA_GAMES . "
ORDER BY game_name";
if( !$result = $db->sql_query($sql) )
{
message_die(GENERAL_ERROR, $lang['no_game_data'], "", __LINE__, __FILE__, $sql);
}
$game_count = $db->sql_numrows($result);
$game_rows = $db->sql_fetchrowset($result);
for($i = 0; $i < $game_count; $i++)
{
$game_id = $game_rows[$i]['game_id'];
$game_name = $game_rows[$i]['game_name'];
if ($game_rows[$i]['reverse_list'])
{
$list_type = 'ASC';
}
else
{
$list_type = 'DESC';
}
$sql = "SELECT * FROM " . iNA_SCORES . "
WHERE game_name = '" . $game_name . "'
ORDER BY score $list_type, date ASC";
if(!$result = $db->sql_query($sql))
{
message_die(GENERAL_ERROR, $lang['no_score_data'], "", __LINE__, __FILE__, $sql);
}
$score_info = $db->sql_fetchrow($result);
$best_player[$i] = $score_info['player'];
$arr[$best_player] = $arr[$best_player] + 1;
$template->assign_block_vars("game", array(
"BEST_PLAYER" => $best_player[$i],
"NAME" => $game_name)
);
}
$zaehle = array_count_values($best_player);
while(list($key, $val) = each($zaehle))
{
$template->assign_block_vars("hiscore", array(
"NAME" => $key,
"ANZ" => $val
));
$hi[$key] = $val;
$array = array($key=>array(current($array[$key])=>$val));
}
(es sind in dem Code noch ein paar unnötige Zeilen, die mom noch der Kontrolle dienen, ob die Variablen richtig belegt sind)
Stimmt die Array-Zuweisung in der Forum?
Wenn ja, wie realisiere ich das mit der While-Schleife(soll nach dem o.a. Code kommen; übergibt den Array an das Template) bei einem multidimensionalem Array? Was kann ich als Bedingung für die Schleife verwenden?
Verfasst: 20.11.2004 18:06
von saerdnaer
mach mal aus dem
Code: Alles auswählen
$array = array($row['highscore_player']=>array($row['Anzahl']=>0));
folgendes
das
Code: Alles auswählen
$array = array($key=>array(current($array[$key])=>$val));
sieht auch ziemlich seltsam aus
was soll der code denn eigendlich machen?
Verfasst: 20.11.2004 19:20
von D@ve
Also ich blick da auch nicht wirklich durch. Vierfach verschachtelte mehrdimensionale Arrays (weißt Du wieviel Millionen Datensätze so erzeugst).
Nun war mein Gedanke, daß ich in der ersten Schleife nur den Array mit "key" und "Wert1 beschreibe
Was meinst Du mit "Key"?? Als Key bezeichnet man in der Regel den Schlüssel des Arrays, also den Wert in echigen Klammern:
Du kannst den zwar mit dem Befehl key() theoretisch auch wieder in array schreiben:
wirklich Sinn machen tut das aber nicht...
Alternativ kannst Du auch noch auf eine Array über eine foreach-Schleife in verbindung mit "as" zugreifen
Code: Alles auswählen
foreach($array as $key => $inhalt)
{
echo 'Inhalt des Array an der Stelle ' . $key . ' ist ' . $inhalt .'<br>';
}
Aber wie schon gesagt: Vielleicht schreibst Du einfach mal, was Du vorhhast...
Gruß, Dave
Verfasst: 20.11.2004 20:26
von Gumfuzi
Es handelt sich hierbei um den Activity Mod, wo ich nun auf einer eigenen Seite eine spezielle Liste haben will:
Der ActivityMod speichert u.a. einen "ewigen" HiScore und einen MonatsHiScore (in zwei getrennten Tabellen) für jedes Spiel, damit man weiß, wer im aktuellen Monat die meisten Punkte hat und wer den all-time-Rekord hält.
Ich will genau wissen, welcher Spieler wieviel Monatsrekorde bzw. ewige Rekorde hat und dann mit einer Formel eine Liste der besten Spieler berechnen lassen.
Mit dem o.a. Code habe ich ja bereits folgendes geschafft:
1.)
es werden Spielername und Anzahl MonatsHiScores an die Template übergeben (noch unsortiert)
2.)
es werden Spielername und Anzahl ewiger HiScores an die Template übergeben. (noch unsortiert)
Wie kann ich jetzt diese Informationen in EINE Schleife verpacken, wo dann Spielername, Anzahl MonatsHiScores UND Anzahl ewiger Hiscores an die Template übergeben werden? Ebenso sollte zusätzlich eine weitere Variable mitübergeben werden (zB. MonatsHiScore * 2 + ewiger Hiscore * 5) und nach dieser sollte dann sortiert werden.
Verfasst: 21.11.2004 21:10
von Gumfuzi
Update:
Code: Alles auswählen
$monat = 2;
$ewig = 5;
$sql='SELECT highscore_player, Count(*) AS Anzahl FROM `phpbb_ina_highscore` WHERE `highscore_mon` = ' . date("m", time()) . ' AND `highscore_year` = ' . date("Y", time()) . ' GROUP BY highscore_player';
if(!$result = $db->sql_query($sql)) {
message_die(GENERAL_ERROR, 'Fehler beim Auslesen der HiScore-Informationen', '', __LINE__, __FILE__, $sql);
}
while($row = $db->sql_fetchrow($result))
{
$mon[$row['highscore_player']] = $row['Anzahl'];
}
$sql = "SELECT * FROM " . iNA_GAMES . "
ORDER BY game_name";
if( !$result = $db->sql_query($sql) )
{
message_die(GENERAL_ERROR, $lang['no_game_data'], "", __LINE__, __FILE__, $sql);
}
$game_count = $db->sql_numrows($result);
$game_rows = $db->sql_fetchrowset($result);
for($i = 0; $i < $game_count; $i++)
{
$game_id = $game_rows[$i]['game_id'];
$game_name = $game_rows[$i]['game_name'];
if ($game_rows[$i]['reverse_list'])
{
$list_type = 'ASC';
}
else
{
$list_type = 'DESC';
}
$sql = "SELECT * FROM " . iNA_SCORES . "
WHERE game_name = '" . $game_name . "'
ORDER BY score $list_type, date ASC";
if(!$result = $db->sql_query($sql))
{
message_die(GENERAL_ERROR, $lang['no_score_data'], "", __LINE__, __FILE__, $sql);
}
$score_info = $db->sql_fetchrow($result);
$best_player[$i] = $score_info['player'];
$arr[$best_player] = $arr[$best_player] + 1;
}
$zaehle = array_count_values($best_player);
while(list($key, $val) = each($zaehle))
{
$hi[$key] = $val;
}
$sql = "SELECT username FROM " . USERS_TABLE . " ORDER BY username";
if( !$result = $db->sql_query($sql) )
{
message_die(GENERAL_ERROR, $lang['no_user_data'], "", __LINE__, __FILE__, $sql);
}
while($row = $db->sql_fetchrow($result))
{
$user = $row['username'];
if ($mon[$user] > 0 OR $hi[$user] > 0)
{
$c = $c + 1;
$template->assign_block_vars("total", array(
"PLATZ" => $c,
"NAME" => $user,
"MON_ANZ" => $mon[$user],
"HI_ANZ" => $hi[$user],
"TOTAL" => $mon[$user] * $monat + $hi[$user] * $ewig
));
}
}
Nun habe ich endlich meine Liste, wie ich sie wollte, jedoch ist die nicht sortiert.
Wie kann ich die Ausgabe nach "TOTAL" sortieren lassen? Geht das innerhalb der Schleife, oder muss ich da zuerst ein multidimensionales Array definieren, nur bin ich echt zu dumm dafür, ich checke das mit der Syntax mit diesen (multi-)Arrays nicht, ich probiere schon seit tagen, aber das wird nix.
Mit array_multisort kann man sortieren, aber ich kann es nichtmal beschreiben (habe auch saerdnaer's Methode benutzt - funzt auch nicht).
Habt Mitleid mit mir und gebt mir bitte noch einen Hinweis, danke!!!