Kleinsten Wert imm Array suchen und entfernen
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
abschneiden
algorithmus
array
bekommen
code
datum
entfernen
frage
gleiche zahl
hauptteil
index
inhalt
kleinsten zahl
list
mehrmaligen vorkommen
point
position
suche
vergleichen
zahl
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
<?php $arr = array(5, 1, 3, 2, 4); echo 'Vorher:<pre>'; print_r($arr); echo '</pre>'; // Hauptteil $minkey = array_search(min($arr), $arr); unset($arr[$minkey]); // Hauptteil echo 'Nachher:<pre>'; print_r($arr); echo '</pre>'; echo 'Kleinster Wert war '.$minkey; ?>
Ungetestet.
Beitrag zuletzt geändert: 17.4.2011 5:20:15 von fabo -
oder so
$arr = array(5, 1, 3, 2, 4); sort($arr); // --------- Array aufsteigend sortieren ### jetit ist es $arr = array(1, 2, 3, 4, 5); unset($arr[0]); // --------- ersten Wert (= kleinster Wert) aus Array löschen
Ungetestet.
edit: kommen die Werte nur einmalig vor?
Beitrag zuletzt geändert: 17.4.2011 7:48:45 von tengames -
ich hätte es an den Selection Sort angelegt. Dabei nimmst du die erste Zahl und vergleichst sie mit der zweiten, ist die zweite kleiner nimmst du die zweite Zahl. Ist sie aber größer behälst du die erste zahl. Bei gleich musst du dir etwas einfallen lassen, denn was ist wenn man mehrere kleinste Zahlen hat.
Angenommen du hast nun die erste Zahl immer noch, vergleichst du sie mit der dritten auf größer kleiner gleich und immer so weiter. Dabei brauchst du nur einmal alle durchgehen unf prüfen, nicht sortieren.
Warum keine sortieron wie tengames es vorgeschlagen hat?
Sortierungen brauchen in der regel länger zeit und ich weiß nicht wieviele Zahlen du hast. Jenachdem wieviele Zahlen du hast, kann sich das ganze in die länge ziehen.
Eventuel wäre es ratsam gleich beim eintragen einer Neuen Zahl, sie sortiert einzuordnen, dadurch sparst du dir eien menge zeit und weißt immer wo der kleinste wert ist. -
min() ist extra dazu gedacht, den kleinsten Wert aus einem Array zu extrahieren.
-
Lieder kann ich den Code von fabo nichtnutzen da eine Zahl durchaus 2mal vor kommen kann.
Zum Code von tengames: Wenn eine Zahl 2x vorkommen sollte, nach was richtet sich dann welche Zahl entfernt wird?
-
wenn Zahlen (die kleinste) mehrfach vorkommen, dann hast Du ein Problem ...
ist in deinen Daten nichts anderes als die Zahl (als Wert) ?
wo holst Du das array her? aus MySQL?
kannst Du anstatt oder zusätzlich zur Zahl ein Datim (timestamp) speichern ?!?
edit ... oder: .... ist sowas vielleicht schon in den Daten vorhanden?
Beitrag zuletzt geändert: 17.4.2011 14:15:58 von tengames -
Bei Fabos Code wird beim mehrmaligen Vorkommen der kleinsten Zahl nur die erste gelöscht. Wie genau willst du es denn?
-
drafed-map schrieb:
Bei Fabos Code wird beim mehrmaligen Vorkommen der kleinsten Zahl nur die erste gelöscht. Wie genau willst du es denn?
Ihr habt zwar jetzt alle was geschrieben aber irgendwie keien Antowrt auf meien Frage
Wenn es 2x die gleiche Zahl gibt welche von den beiden steht dann auf Position 0 und wird gelöscht?
Nach was richtet sich das? -
Das kommt drauf an wie sortiert wird, aber wenn es den gleichen Inhalt hat wie kommst du da auf die Frage welche gelöscht wird?
Ist doch in dem Fall furzegal welche gelöscht wird, da sie genau gleichgroß sind.
Aber du kannst fabos Beispiel auch ganz einfach erweitern. Stell dich doch nicht so an.
Wie willst du sonst je was gebacken bekommen.
<?php $arr = array(5, 1, 1, 3, 2, 4); echo 'Vorher:<pre>'; print_r($arr); echo '</pre>'; // Hauptteil $firstmin = min($arr); while( min($arr) == $firstmin ) { $minkey = array_search($firstmin, $arr); unset($arr[$minkey]); } // Hauptteil echo 'Nachher:<pre>'; print_r($arr); echo '</pre>'; echo 'Kleinster Wert war '.$minkey; ?>
oder auch so:
// Hauptteil $firstmin = min($arr); $index = array_search($firstmin, $arr); do { unset($arr[$index]); $index = array_search($firstmin, $arr); } while( $index !== false ); // Hauptteil
Beitrag zuletzt geändert: 17.4.2011 14:49:02 von reimann -
Gut Habs dann soweit aber eien Frage noch:
Wie kann ich mit min(); bei multiplen Arrays nur ein Inhalt vergleichen also z.B.:
$points = array( array(0,1,4), array(0,2,2), array(1,2,5), array(1,3,5), array(2,3,5), array(3,4,5), array(4,5,5), array(4,5,5), array(2,10,30), array(2,11,40), array(5,19,20), array(10,11,20), array(12,13,20), );
Da will ich jetzt immer nur die 2. Zhal im Array vergleichen(1,2,2,3,3,4..) -
testworld schrieb:
Na, wie wäre es, wenn du mal den Text, den du zitiert hast, lesen würdest?
drafed-map schrieb:
Ihr habt zwar jetzt alle was geschrieben aber irgendwie keien Antowrt auf meien Frage
Bei Fabos Code wird beim mehrmaligen Vorkommen der kleinsten Zahl nur die erste gelöscht. Wie genau willst du es denn?
Wenn es 2x die gleiche Zahl gibt welche von den beiden steht dann auf Position 0 und wird gelöscht?
Nach was richtet sich das?
testworld schrieb:
Das geht mit min() nicht so einfach. Du müsstest mit foreach immer das Element 1 nehmen und es einem neuen Array zufügen. Dann müsstest du dieses Array durch min() schicken.
Gut Habs dann soweit aber eien Frage noch:
Wie kann ich mit min(); bei multiplen Arrays nur ein Inhalt vergleichen also z.B.:
$points = array( array(0,1,4), array(0,2,2), array(1,2,5), array(1,3,5), array(2,3,5), array(3,4,5), array(4,5,5), array(4,5,5), array(2,10,30), array(2,11,40), array(5,19,20), array(10,11,20), array(12,13,20), );
Da will ich jetzt immer nur die 2. Zhal im Array vergleichen(1,2,2,3,3,4..) -
Eine andere Möglichkeit gibt es nicht?
Bzw. wie greife ich dann wieder auf die anderen Inahlte im alten Array zurück?
Beitrag zuletzt geändert: 17.4.2011 15:45:36 von testworld -
Was du versuchen könntest wäre, aus deinem Originalarray ein neues Array zu bilden (um das Ganze konform zu halten). Auf das neu generierte Array wendest du dann wieder die Suche an...
<?php $points = array( array(0,1,4), array(0,2,2), array(1,2,5), array(1,3,5), array(2,3,5), array(3,4,5), array(4,5,5), array(4,5,5), array(2,10,30), array(2,11,40), array(5,19,20), array(10,11,20), array(12,13,20), ); foreach($points as $item) { if(is_array($item)) { foreach($item as $item2) { $newarr[] = $item2; } } else { $newarr[] = $item; } } echo 'Vorher:<pre>'; print_r($newarr); echo '</pre>'; // Hauptteil $firstmin = min($newarr); $index = array_search($firstmin, $newarr); do { unset($newarr[$index]); $index = array_search($firstmin, $newarr); } while( $index !== false ); // Hauptteil echo 'Nachher:<pre>'; print_r($newarr); echo '</pre>'; echo 'Kleinster Wert war '.$firstmin; ?>
So, oder so ähnlich... Einziges Problem: Du wirst das Originalarray abzüglich der entfernten Werte nicht wieder zusammensetzen können. Vielleicht erklärst du, was genau du vor hast, sodass man evtl. eine optimalere Lösung finden könnte.
Ich glaube aber, dass man das Generieren eines neuen Arrays auch umgehen kann, mit einer rekursiven Suche.
Das Problen an min() bei deinem Array ist, dass er nicht im gesamten Array nach der kleinsten Zahl sucht, sondern das Array mit dem geringsten Wert rausfiltert d.h. die Rückgabe wäre ein Array, bestehend aus 0,1,4
Beitrag zuletzt geändert: 17.4.2011 16:33:15 von fabo -
Es geht um den A*Algorithmus und dem Abschnitt:
// Knoten mit dem geringsten f Wert aus der Open List entfernen
currentNode := openlist.removeMin()
Ich brauch halt noch die anderen Werte und die Frage ist nun wie ich die wieder bekommen kann bzw. wie ich das identfizeiren soll, gibts da irgendeine Lösung? -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage