Ankündigung

Einklappen
Keine Ankündigung bisher.

[erledigt]array_keys() gibt nur einen key zurück, obwohl 2 vorhanden

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [erledigt]array_keys() gibt nur einen key zurück, obwohl 2 vorhanden

    guten tag zusammen...
    ich möchte, wenn mehr als ein wert vorhanden, die keys mit dem höchsten wert aus einem array ausgeben lassen, daher:

    PHP-Code:
     if(count( ${"dif_array_sorted".($l)}) > 1) {  
             ${
    "TS_ID_array".($l)} = array_keys(${"dif_array_sorted".($l)}, max(${"dif_array_sorted".($l)})); 
         } 
    aber ich bekomme nur einen key zurück, obwohl zwei mit dem selben wert vorhanden sind:
    PHP-Code:

            
    if(count( ${"dif_array_sorted".($l)}) > 1) { 
     
                
    var_dump(   ${"dif_array_sorted".($l)});
                echo 
    '   max: '.max(${"dif_array_sorted".($l)}).'<br>'
     
                ${
    "TS_ID_array".($l)} = array_keys(${"dif_array_sorted".($l)}, max( ${"dif_array_sorted".($l)})); 

                
    var_dump(${"TS_ID_array".($l)})  
    }

    //ergibt:
    //array(2) { [1]=>  float(108.2) [3]=>  float(108.2) } max: 108.2
    //array(1) { [0]=> int(1) } 
    versteh ich nich..
    verbindet max() den wert mit dem key?
    hab ich irgendwas anderes grundsätzlich nicht verstanden?


    ich bin blutiger anfänger und vermutlich ist es was lächerlich simples, aber ich find den fehler nicht....
    vielen dank schonmal im vorraus..jan

  • jpedder
    antwortet
    ok, problem gelöst...

    das war wohl ein fließkommagenauigkeitsproblem.aus der manual:
    Fließkommagenauigkeit

    Es ist typisch das einfache Dezimalbrüche wie 0.1 oder 0.7 nicht ohne kleine Ungenauigkeiten in ihr internes binäres Gegenstück umgewandelt werden können. Dies kann zu verwirrenden Ergebnissen führen, so ergibt floor((0.1+0.7)*10) in der Regel 7 an Stelle der der erwarteten 8 da die interne Repräsentation eher bei 7.9 liegt.

    Dies liegt daran das es unmöglich ist bestimmte Werte mit einer endlichen Anzahl von Nachkommenstellen darzustellen. So wird zum Beispiel 1/3 im Dezimalsystem 0.3.
    ich runde jetzt die (float)$variable auf 2 kommastellen:
    PHP-Code:
     if(count$array1 1) { 
     
                
    var_dump($array_1);
                echo 
    '   max: '.max($array_1).'<br>';
    //ergibt immer noch:
    //array(2) { [1]=>  float(108.2) [3]=>  float(108.2) } max: 108.2
               
                
             
               
    $max max($array_1);
               
    $maxround round($max,2);

               
    $array_2 array_keys($array_1$maxround); 




    //allerdings ergibt jetzt
                
    var_dump($array_1
    //array(2) { [0]=> int(1) [1]=>int(3) }  
    //und somit 
    var_dump($array_2[1] == $array_2[3]); 
    // = bool(true);

    trotz quälcode...

    danke euch

    Einen Kommentar schreiben:


  • jpedder
    antwortet
    nikosch:
    keine absicht...
    meine ersten php scripte, ich kanns noch nich besser...

    Einen Kommentar schreiben:


  • nikosch
    antwortet
    Die Aussage schloss Dich durchaus mit ein. Wer solchen Quälcode baut, braucht sich doch nicht zu wundern, wenn er hinterher nicht mehr durchsieht.

    Einen Kommentar schreiben:


  • jpedder
    antwortet
    danke für die schnellen antworten...

    @fab:
    eigenartig, ich (wie gesagt, bekackter amateur) wußte nicht das eine variable mehr eigenschaften hat als in dem fall float und den wert.
    PHP-Code:
    var_dump(${'dif_array_sorted' $l}[1] == ${'dif_array_sorted' $l}[3]); 
    //ergibt
    //bool(false) 
    wo liegt der unterschied?
    kann man tiefer in eine variable reingucken als mit var_dump()?

    @nikosch:
    weiss ja nich, was wichtig sein könnte, ´noob halt. deswegen hab ich alles mitreingerummelt. also im endeffekt läuft es auf
    PHP-Code:
     if(count$array1 1) { 
     
                
    var_dump($array_1);
                echo 
    '   max: '.max($array_1).'<br>'
     
                
    $array_2 array_keys($array_1max($array_1); 

                
    var_dump($array_2)  

    //ergibt:
    //array(2) { [1]=>  float(108.2) [3]=>  float(108.2) } max: 108.2
    //array(1) { [0]=> int(1) } 
    hinaus.


    @lstegelitz:
    das wäre eine erklärung...

    zumal ich ja gerade feststelle, das die variablen noch nicht mal gleich sind, obwohl sie aus den gleichen daten einer xml-datei in einer schleife entstehen...

    Einen Kommentar schreiben:


  • lstegelitz
    antwortet
    max() bestimmt einen Maximalwert aus einer Reihe von Werten - und davon kann es per Definition immer nur genau einen geben!
    (Um neues Maximum zu werden, muss ein Wert größer sein als der Vergleichswert - Gleichheit reicht nicht aus)

    Einen Kommentar schreiben:


  • nikosch
    antwortet
    ${"TS_ID_array".($l)}
    Nicht Dein Ernst! Wer soll diesen Sch... analysieren?!

    Einen Kommentar schreiben:


  • fab
    antwortet
    array_keys verwendest du schon richtig. Prüfe doch einmal ob die beiden float-Werte wirklich gleich sind:

    PHP-Code:
    var_dump(${'dif_array_sorted' $l}[1] == ${'dif_array_sorted' $l}[3]); 
    (btw: wie du siehst, musst du atomare Ausdrücke nicht auch noch mit runden Klammern versehen)

    Einen Kommentar schreiben:

Lädt...
X