kostenloser Webspace werbefrei: lima-city


Kleinsten Wert imm Array suchen und entfernen

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    testworld

    testworld hat kostenlosen Webspace.

    Hey,

    Wir der Titel schon sagt will ich den kleinsten Wert im Array(Alles Ganzzahlen) finden und aus dem Array entfernen?
    Wie realsiere ich das nun am besten? Gibts dafür eien speziele Funktion?


    Mfg..
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

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

  3. <?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
  4. 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
  5. e******n

    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.
  6. min() ist extra dazu gedacht, den kleinsten Wert aus einem Array zu extrahieren.
  7. Autor dieses Themas

    testworld

    testworld hat kostenlosen Webspace.

    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?
  8. 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
  9. Bei Fabos Code wird beim mehrmaligen Vorkommen der kleinsten Zahl nur die erste gelöscht. Wie genau willst du es denn?
  10. Autor dieses Themas

    testworld

    testworld hat kostenlosen Webspace.

    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 :biggrin:
    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?
  11. 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
  12. Autor dieses Themas

    testworld

    testworld hat kostenlosen Webspace.

    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..)
  13. testworld schrieb:
    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 :biggrin:
    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?
    Na, wie wäre es, wenn du mal den Text, den du zitiert hast, lesen würdest?

    testworld schrieb:
    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..)
    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.
  14. Autor dieses Themas

    testworld

    testworld hat kostenlosen Webspace.

    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
  15. 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
  16. Autor dieses Themas

    testworld

    testworld hat kostenlosen Webspace.

    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?
  17. 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!