Seite 1 von 1

Array sortieren und höchsten Wert ausgeben

Verfasst: 07.07.2006 17:29
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]

Verfasst: 07.07.2006 21:56
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

Verfasst: 07.07.2006 22:00
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 )

Verfasst: 07.07.2006 22:08
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

Verfasst: 07.07.2006 22:35
von kratzer54847
Funktioniert wunderbar,

danke!