Array sortieren und höchsten Wert ausgeben

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Antworten
Benutzeravatar
kratzer54847
Mitglied
Beiträge: 3065
Registriert: 20.01.2003 16:34
Wohnort: Düsseldorf/Hannover/Berlin
Kontaktdaten:

Array sortieren und höchsten Wert ausgeben

Beitrag von kratzer54847 »

Hallo,

folgendes Problem: Ich lasse mir über diesen Codeblock ein Array füllen, dass der ID eines Forums die jeweilige Prozentzahl der erstellten Beiträge eines Benutzers bezogen auf die Gesamtzahl der Posts eines Forums zuordnet:

Code: Alles auswählen

//
// The users most active forum
//

$sql = "SELECT forum_id, forum_posts
		FROM " . FORUMS_TABLE . "";
$result = $db->sql_query($sql);

while ( $row = $db->sql_fetchrow($result) )
{
	$fids = $row['forum_id'];
	$fposts = $row['forum_posts'];

	// Second: get the user's post count for each forum
	$sqlsub = "SELECT COUNT(post_id) AS posts
			FROM " . POSTS_TABLE . "
			WHERE poster_id = '" . $profiledata['user_id'] . "'
			AND forum_id = '$fids'";
	$resultsub = $db->sql_query($sqlsub);
	
	while ( $rowsub = $db->sql_fetchrow($resultsub) )
	{
		$uposts = $rowsub['posts'];
		
		$percentage = array();
		
		if ( $uposts != '0' )
		{
			//
			// Lets do some calculating work
			//
			$percentage['a'] = $uposts / $fposts;
			$percentage[$row['forum_id']] = $percentage['a'] * 100;
		}
		else
		{
			$percentage[$row['forum_id']] = '0.00';
		}
		
		echo "Prozentsatz der Einzelforen: " . $row['forum_id'] . " " . $percentage[$row['forum_id']];
	}
}
Die ausgelesenen Werte sind auch soweit korrekt, nur müsste jetzt das Array absteigend anhand des Prozentsatzes sortiert werden sowie nur der höchste Prozentsatz ausgegeben werden.

Das Sortieren per array_multisort() bereitet insofern Probleme, dass der zu sortierende Block bereits ein Array beinhaltet:

Code: Alles auswählen

//
// Lets do some calculating work
//
$percentage['a'] = $uposts / $fposts;
$percentage[$row['forum_id']] = $percentage['a'] * 100;
$percentage[$row['forum_id']] = array_multisort($percentage[$row['forum_id']], SORT_DESC, SORT_NUMERIC);
...funktioniert natürlich nicht.
Somit ist auch keine Limitierung des Arrays machbar.

Wie lässt sich dieses Problem umgehen?[/code]
Knowledge Base | MOD Datenbank | Boardsuche | HTML | PHP

Durch die richtige Verwendung dieser Links können viele Fragen beantwortet werden ;-)
Benutzeravatar
cYbercOsmOnauT
Ehemaliges Teammitglied
Beiträge: 3820
Registriert: 18.02.2004 23:02
Wohnort: Göttingen
Kontaktdaten:

Beitrag von cYbercOsmOnauT »

Ich würd Dir gerne helfen. Aber so ganz erfasse ich nicht, was Du genau vor hast.

Wo soll nach Prozentsatz sortiert werden? $profiledata wird doch von phpBB beim Viewprofile verwendet und da sieht man eh nur die Daten des Users, den man sich gerade ansieht.

Nebenbei gesagt: Du kannst auch nach posts ORDER'n

Ich hab folgenden Test auf meinem Board durchgeführt und bekam die Prozenzsätze mit den poster_id's korrekt dortiert zurück.

Code: Alles auswählen

SELECT poster_id, COUNT(post_id) AS posts FROM phpbb_posts
WHERE forum_id = 2
AND poster_id <> -1
GROUP BY poster_id
ORDER BY posts DESC;
Grüße,
Tekin
• prof. phpbb-Installation, Reparatur, Rettung nach Hackattacken, sowie PHP/JS Programmierung aller Art
Zend Certified Engineer, Linux Administrator und die Sicherheit von 34 Jahren Programmiererfahrung
• Interesse? Kontakt unter t.birduezen@web-coding.eu
Benutzeravatar
kratzer54847
Mitglied
Beiträge: 3065
Registriert: 20.01.2003 16:34
Wohnort: Düsseldorf/Hannover/Berlin
Kontaktdaten:

Beitrag von kratzer54847 »

Hallo,

Ziel ist es, im Profil der User anzuzeigen, in welchem Bereich des Boards sich der jeweilige User am Aktivsten beteiligt hat. Hier plane ich eine Anzeige dieser Art:

Aktivstes Forum: Forum XY ( 18,23 % aller Beiträge des Forums )
Knowledge Base | MOD Datenbank | Boardsuche | HTML | PHP

Durch die richtige Verwendung dieser Links können viele Fragen beantwortet werden ;-)
Benutzeravatar
cYbercOsmOnauT
Ehemaliges Teammitglied
Beiträge: 3820
Registriert: 18.02.2004 23:02
Wohnort: Göttingen
Kontaktdaten:

Beitrag von cYbercOsmOnauT »

Ah da kommen wir der Sache doch endlich näher. Nun kapier ich auch, was Du vor hast. :D

Code: Alles auswählen

$sql = 'SELECT f.forum_id, f.forum_posts, COUNT(p.post_id) AS posts
FROM phpbb_forums AS f, phpbb_posts AS p
WHERE p.forum_id = f.forum_id
AND p.poster_id = ' . $profiledata['user_id'] . '
GROUP BY f.forum_id
ORDER BY posts DESC
LIMIT 1';
Ein optimiertes SQL reicht. Du musst nicht einmal Schleifen programmieren. Du solltest Dich ein wenig tiefer mit SQL-Grundlagen befassen. ;)

Grüße,
Tekin
• prof. phpbb-Installation, Reparatur, Rettung nach Hackattacken, sowie PHP/JS Programmierung aller Art
Zend Certified Engineer, Linux Administrator und die Sicherheit von 34 Jahren Programmiererfahrung
• Interesse? Kontakt unter t.birduezen@web-coding.eu
Benutzeravatar
kratzer54847
Mitglied
Beiträge: 3065
Registriert: 20.01.2003 16:34
Wohnort: Düsseldorf/Hannover/Berlin
Kontaktdaten:

Beitrag von kratzer54847 »

Funktioniert wunderbar,

danke!
Knowledge Base | MOD Datenbank | Boardsuche | HTML | PHP

Durch die richtige Verwendung dieser Links können viele Fragen beantwortet werden ;-)
Antworten

Zurück zu „Coding & Technik“