kostenloser Webspace werbefrei: lima-city


php arrays sortieren

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    horrorfilme

    horrorfilme hat kostenlosen Webspace.

    Guten Abend,

    Nun ich habe ein Problem, das ich alleine nicht lösen kann :-S

    Also ich habe einen Array der ungefähr so aussieht:

    Array
    (
        [0] => Array
            (
                [id] => 1
                [rating] => 84.1
            )
    
        [1] => Array
            (
                [id] => 2
                [rating] => 78
            )
    
        [2] => Array
            (
                [id] => 3
                [rating] => 106.9
            )
    
        [3] => Array
            (
                [id] => 4
                [rating] => 64.2
            )
    
        [4] => Array
            (
                [id] => 6
                [rating] => 522.9
            )
    )


    Nun habe ich schon seit stunden mit uasort, usort, sort etc. gearbeitet aber nie den gewünschten erfolg erzielt, weil ich ja ein mehrdimensionales array hab wo ich die werte sortieren will.

    Ich möchte alle arrays nach dem rating sortieren, also das der array mit dem höchsten rating auch der erste array ist, der mit dem niedrigsten rating der letzte.

    while($row = mysql_fetch_object($sql)){
    	$array[$i]["id"] = $row->id;
    	$array[$i]["rating"] = $row->rating/$row->countrating;
    	$i++;
    }


    Damit erzeuge ich diesen Array.

    Könnt ihr mir vielleicht weiterhelfen? =)
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Mit welcher Abfrage holst Du denn die Daten aus der Datenbank? Vielleicht kann man die ja schon mit "... ORDER BY rating DESC" abfragen?!?
  4. Autor dieses Themas

    horrorfilme

    horrorfilme hat kostenlosen Webspace.

    staymyfriend schrieb:
    Mit welcher Abfrage holst Du denn die Daten aus der Datenbank? Vielleicht kann man die ja schon mit "... ORDER BY rating DESC" abfragen?!?


    Das hatte ich vorher und klappte wunderbar, aber die Daten in der DB werden dynamisch vom benutzer verändert - so ein Rating für Filme, wo jeder bis zu 10 sterne geben kann - hab dann immer einfach die gesamtanzahl der sterne addiert und durch die anzahl der stimmen dividiert, und da ist das problem: Wenn ein Film 10 stimmen hat und durchschnittlich 6 punkte hat er dennoch mehr GESAMTsterne als ein film mit 1 stimme dafür 10 punkte durchschnittlich (kompliziert ich weiß)

    jedenfalls funktionierts mit ORDER BY rating DESC nicht :-(
  5. g****e

    Hier gibt es eigentlich mehrere Ansätze. Entweder:
    $tmpArray = array(); 
    foreach($data as $key => $value) { 
        $tmpArray[$key] = $value['rating']; 
    } 
    
    array_multisort($tmpArray, SORT_DESC, SORT_NUMERIC, $data);


    Oder du gehst doch mittels usort ran:
    function checkRating ( $a , $b ) {
        if ( $a['rating'] == $b['rating']) { return 0; }
        else if ( $a['rating'] < $b['rating']) { return -1; }
        else { return 1; }
    }
    usort( $data , 'checkRating' );


    Beides ungetestet, sollte aber funktionieren.

    Liebe Grüße

    Beitrag zuletzt geändert: 4.11.2012 20:55:26 von ggamee
  6. Speicherst Du die Anzahl der Stimmen und/oder Anzahl der Sterne auch in dieser Datenbank?
    "... ORDER BY rating DESC, countrating ASC"???

    Beitrag zuletzt geändert: 4.11.2012 21:11:15 von staymyfriend
  7. Autor dieses Themas

    horrorfilme

    horrorfilme hat kostenlosen Webspace.

    staymyfriend schrieb:
    Speicherst Du die Anzahl der Stimmen und/oder Anzahl der Sterne auch in dieser Datenbank?


    Ja ;-) - ""... ORDER BY rating DESC, countrating ASC" : hm, das funktioniert nicht :S

    ggamee schrieb:
    Hier gibt es eigentlich mehrere Ansätze. Entweder:
    $tmpArray = array(); 
    foreach($data as $key => $value) { 
        $tmpArray[$key] = $value['rating']; 
    } 
    
    array_multisort($tmpArray, SORT_DESC, SORT_NUMERIC, $data);


    Oder du gehst doch mittels usort ran:
    function checkRating ( $a , $b ) {
        if ( $a['rating'] == $b['rating']) { return 0; }
        else if ( $a['rating'] < $b['rating']) { return -1; }
        else { return 1; }
    }
    usort( $data , 'checkRating' );


    Beides ungetestet, sollte aber funktionieren.

    Liebe Grüße


    Hey, danke das mit dem multisort hat funktioniert :-D

    Aber jetzt habe ich schon mein nächstes Problem:

    Also ich hab sie jetzt sortiert und möchte jetzt die zehn ersten filme im Array in einer neuen Abfrage holen, also jene filme die im array die ersten 10 sind, denn diese sind ja nach dem richtigen Rating sortiert.
    Jetzt hab ich das so gemacht:

    $abfrage = "SELECT * FROM `movies` WHERE ";
    $i = 0;
    while($i < $maxFilms){
    	$abfrage .= "`id`='".$array[$i]['id']."'";
    	$i++;
    	if($maxFilms != $i){
    		$abfrage .= " OR ";
    	}
    }


    Aber es funktioniert nicht, wenn ich die Abfrage anschaue kommt zwar folgendes:
    SELECT * FROM `movies` WHERE `id`='12' OR `id`='1' OR `id`='2' OR `id`='3' OR `id`='13' OR `id`='10' OR `id`='9' OR `id`='14' OR `id`='7' OR `id`='4'

    Aber er sortiert sie automatisch wieder nach dem Rating in der DB, was er ja nicht tun soll - warum? Gibts da eine möglichkeit, die so abzufragen, wie sie im array stehen?

    danke euch schonmal :-D


    EDIT: Oh.. Ich hab grad gemerkt, das ich 2 Stunden verschwendet hab...

    staymyfriend schrieb:
    Speicherst Du die Anzahl der Stimmen und/oder Anzahl der Sterne auch in dieser Datenbank?
    "... ORDER BY rating DESC, countrating ASC"???


    Du hast mir eine idee gegeben: Warum das ganze nicht in der Abfrage berechnen? UND DAS GEHT :-D

    $abfrage = "SELECT * FROM `movies` ORDER BY (rating/countrating) DESC LIMIT 0,10";


    Danke euch :-D

    Beitrag zuletzt geändert: 4.11.2012 21:17:34 von horrorfilme
  8. g****e

    Nein, du kannst leider SQL nicht sagen, welche Reihenfolge du gern hast. Ich glaub das geht von oben durch, und was er zuerst findet, das kommt zuerst in die outputliste. Das musst du mit PHP nachbearbeiten:
    Du weißt es werden 10 Einträge. Du kannst also sagen, die Einträge 0-9 werden übrig bleiben. Erstmal das sortierte Array beschneiden, dann können wir das Ergebnis nachsortieren:
    $result = mysql_query(...);
    $tmpdata = array_slice( $data , 0 , 10 );
    $dataId = array();
    foreach ( $tmpdata as $v ) { $dataId[] = $v['id']; }
    $resultArray = array();
    while ( $row = mysql_fetch_assoc( $result ) ) {
        $resultArray[ array_search($row[id] , $dataId ] = $row;
    }

    Wenn ich mich jetzt nicht vertan habe, sollte das richtig sein.

    Liebe Grüße
  9. Autor dieses Themas

    horrorfilme

    horrorfilme hat kostenlosen Webspace.

    ggamee schrieb:
    Nein, du kannst leider SQL nicht sagen, welche Reihenfolge du gern hast. Ich glaub das geht von oben durch, und was er zuerst findet, das kommt zuerst in die outputliste. Das musst du mit PHP nachbearbeiten:
    Du weißt es werden 10 Einträge. Du kannst also sagen, die Einträge 0-9 werden übrig bleiben. Erstmal das sortierte Array beschneiden, dann können wir das Ergebnis nachsortieren:
    $result = mysql_query(...);
    $tmpdata = array_slice( $data , 0 , 10 );
    $dataId = array();
    foreach ( $tmpdata as $v ) { $dataId[] = $v['id']; }
    $resultArray = array();
    while ( $row = mysql_fetch_assoc( $result ) ) {
        $resultArray[ array_search($row[id] , $dataId ] = $row;
    }

    Wenn ich mich jetzt nicht vertan habe, sollte das richtig sein.

    Liebe Grüße


    Hm, das dürfte stimmen ja, aber ich habs mittlerweile mit

    $abfrage = "SELECT * FROM `movies` ORDER BY (rating/countrating) DESC LIMIT 0,10";


    gemacht und es hat perfekt sortiert genau das ausgeben, was ich wollte :-D

    Trotzdem danke
  10. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!