• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Größte Zahl aus Array herausfinden

Status
Für weitere Antworten geschlossen.

gollum1990

Neues Mitglied
Hallo liebes Forum,

wie bekomme ich aus einem Array die Größte Zahl heraus?

Zur Problemstellung ich habe ein Counter Skript das speziell für eine ID, die aktuellen Zahlen ausgibt und diese dann +1 addieren tut. Jetzt möchte eine sogenannte Top Liste erstellen. Z.B. die 10 Besten IDS, das ganze ist in einem File gespeichert und sieht wie folgt aus:
Code:
id4|5000|id6|6000

Den String habe ich in einem Array zerlegt mittels explode. Und das array sieht dann so aus:
PHP:
array[0] = id4;
array[1] = 5000;
array[2] = id6;
array[3] = 6000;

Sagen wir mal ich möchte jetzt die Beste ID dort herausfiltern, wie kann ich das anstellen?

MFG gollum1990
 
Werbung:
Array sortieren. Wenn nötig , vorher Array kopieren, das kopierte Array sortieren. Funktion : sort bzw. arsort.
Benutze besser ein zweidimensionales Array:
<code>
array["id4"] = 5000;
array["id6"] = 6000;
</code>
 
So würde ich's versuchen:
PHP:
<?php
    foreach($array as $key => $val)
    {
      if($key%2)
         $count[] = (int)$val;
      else
        $id[] = $val;
    }
    array_multisort($count, $id);
    
    $call = count($id)-1;

    echo "Beste ID: ".$id[$call]."(".$count[$call]." Punkte)"; 
?>
Das sortiert zwar, aber irgendwie krieg ich's nicht richtig rum hin. Weder SORT_DESC als flag, noch array_reverse haben da geholfen.

Kratzbaum: sort() überschreibt aber alle Keys, damit wären die IDs weg.
 
Werbung:
Also wenn es nur um die größte zahl geht kannst du auch einfach max() benutzen.
 
Benutze besser ein zweidimensionales Array:
<code>
array["id4"] = 5000;
array["id6"] = 6000;
</code>

das ist auch nur ein eindimensionales array....


ohne dir jetzt genauen code zu schreiben, evtl. hilft dir folgende strategie:

1. du schaffst dir 2 variablen: $id und $value, beide initialiserst du mit ="0"

2. jetzt bastelst du eine schleife, in der du alle elemente des arrays durchgehst und mit dem wert von value vergleichst und wenn er größer ist speicherst du den neuen wert in value und die dazugehörige id in id, und so hast du den höchsten wert.
 
1. du schaffst dir 2 variablen: $id und $value, beide initialiserst du mit ="0"

2. jetzt bastelst du eine schleife, in der du alle elemente des arrays durchgehst und mit dem wert von value vergleichst und wenn er größer ist speicherst du den neuen wert in value und die dazugehörige id in id, und so hast du den höchsten wert.

Das ganze liefert nur den höchsten Wert. Wie ich bereits sagte, kann man dazu einfach max() benutzen. Da kannst einfach das Array reinstecken, egal ob da noch strings drin sind oder nicht.

Wenn es um die ersten 10 Einträge geht hilft diese Methode überhaupt nicht.
Sie erinnert mich doch sehr an BubbleSort => Sehr langsam und viel zu aufwändig. Da kann man doch viel einfach, wie bereits erwähnt, auf die Array-Sort-Funktionen zurückgreifen.
 
Werbung:
Meine Version funktioniert ja. Man muss nur halt statt via [zahl] via $call-[zahl] auf den gewünschten Eintrag zugreifen :p

Eine andere Möglichkeit sehe ich nicht, ich kenne keine Funktion, die ein assoziatives Array sortiert ohne die Schlüssel zu verändern.

Was ich aber nicht verstehe ist, warum array_reverse() auf keines der beiden Arrays irgendeinen Effekt hatte.
 
@frank:

er wollte ja nicht nur den höchsten wert, sondern auch den zum wert gehörenden schlüssel.

bubblesort hat eine laufzeit von O(n²) während mein algorithmus eine laufzeit von O(n) hat, also gar nicht vergleichbar.

@op:

ich habe gerade die funktion array_flip() gefunden, mit der kannst du die schlüssel und die werte vertauschen.
damit könntest du deinen array tauschen, dann sortieren, dann hast du die werte ja in reihenfolge und dann nochmal mit array_flip wieder die ids als schlüssel benutzen. allerdings darf wohl kein wert doppelt vorkommen. weil diese dann verloren gehen.

PHP: array_flip - Manual
 
Werbung:
Mit SQL Lite kann man das auch machen, aber ich habe eine andere Struktur gewählt trotzdem komm ich immer noch nicht zurecht.

Also das Problem:

Ich habe für jede ID eine Datei angelegt, in dieser Datei steht nur eine Zahl. Die beiden Variablen sind nur Zahlen. Um dort ein gewissen Ranking zu machen hab ich jede Datei eingelesen. Und deren Inhalt ausgelesen. Mit der Funktion die BCF beschrieben hat funktioniert die Sortierung absteigend weitegehend gut, dennoch werden nicht existierende IDS ausgeben und das auch in komplett falscher Reihenfolge, ein reines Wirrwarr. Aber die Count Zahlen werden in richtiger reihenfolge ausgeben.

Also ich schreibe mal den Source Teil hierrein. Dann könnt ihr mal drüber schauen.
PHP:
// Datei Namen und Dateien Anzahl auslesen
	$path = "counts/";
	$handle = opendir($path);
	$countfiles = 0;
	$namefiles = array();
	while($res = readdir($handle))
	{
	      if(is_dir($res)) { }
		  else
		  {
		     $countfiles++;
			 array_push($namefiles, $res);
		  }
	}
	
	// Dateien reihenweise öffnen
	$hanfiles = array();
	$content = array();
	for($i = 0; $i<$countfiles; $i++)
	{
	    $hanfiles[$i] = fopen("counts/".$namefiles[$i], "r");
		$content[$i] = array( $i => fgets($hanfiles[$i], 4096));
		fclose($hanfiles[$i]);
		
	}
	
	$narray = array();
	foreach($content as $key => $value)
	{
	        foreach($value as $id => $count)
			{
			        array_push($narray, $id);
					array_push($narray, $count);
			}
	}
	$count = array();
	$id = array();
	foreach($narray as $l => $v)
	{
	        if($l%2)
			   array_push($count, $v);
			else
			   array_push($id, $v);
	}
	array_multisort($count, $id);
	$string = "";
	$query = array();
	$data = array();
            // Top 50 ausgeben...
	for($a = 1; $a<51; $a++)
	{
	    $call = count($id)-$a;
                 [...]
	}
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben