Ankündigung

Einklappen
Keine Ankündigung bisher.

array innerhalb foreach füllen

Einklappen

Neue Werbung 2019

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

  • array innerhalb foreach füllen

    Hi,

    nun muss ich doch posten ;-(

    Ich hole mir Werte aus einer CSV und DB. Mit diesen Werten (Längen und Breitengrade) wird final die Entfernung zwischen zwei Orten berechnet. Das funkt soweit. Das Ergebnis der Berechnung soll in einem Array gespeichert werden. Ziel ist die Sortierung der Ergebnisse. Es soll der kleinste Wert am Anfang später kommen. Ich wollte es mit sort ($num_wert); bzw. rsort ($num_wert); sortieren lassen.

    Mein Problem ist, das es mir nichts sortiert, da ich "vermutlich" bzw. aussagend immer nur einen Wert im Array liegen habe. Es wird aktuell so ausgegeben:

    Array ( [0] => 145.17 )
    Array ( [0] => 145.17 )
    Array ( [0] => 145.66 )
    Array ( [0] => 147.73 )
    Array ( [0] => 145.39
    )

    Ich bin zu blö… den richtigen Syntax zu schreiben um das Array richtig zu befüllen.
    Kann mir jemand helfen?


    PHP-Code:
    if($plz != "" AND $circumcircle != ""){
                if ((
    $handle fopen("https://xxxxxxxxx.com/wp-content/plugins/customer-characteristics-pick-out/includes/csv/geodaten.csv""r")) !== FALSE) {
                    while ((
    $data fgetcsv($handle1000",")) !== FALSE) {
                        
    $num count($data);
                        for (
    $c=0$c $num$c++) {
                            list(
    $csv_plz$csv_location$csv_latitude$csv_longitude) = explode(";"$data[$c]);
                            if (
    $csv_plz == $plz){
                                echo 
    "<br /><br />Die aktuell eingegebene PLZ: <span style='color: #545454'>".$plz."</span> gehört zu: <span style='color: #545454'>".$csv_location."</span>. Die Suche ergab mit einem Suchradius von:<span style='color: #545454'> ".$circumcircle."</span> km folgende Treffer:";
                                
    $pdo = new PDO('mysql:host=xxxxxxxxx.de;dbname=xxxxxxxxx''xxxxxxxxx''xxxxxxxxx');
                                
    $sql "SELECT latitude, longitude, email, image FROM customer_characteristics WHERE be_women_or_man='".$session_women_or_man."'";
                                foreach (
    $pdo->query($sql) as $row) {
                                    
    $summe_km round(acos(sin(deg2rad($csv_latitude)) * sin(deg2rad($row['latitude'])) + cos(deg2rad($csv_latitude)) * cos(deg2rad($row['latitude'])) * cos(deg2rad($row['longitude']) - deg2rad($csv_longitude))) * 6380,2);

                                    
    /* AB HIER HAB ICH MEIN PROBLEM */

                                    
    $array_summe_km = array($summe_km);

                                    
    sort ($array_summe_km);
                                    
    print_r ($array_summe_km);

                                    
    /* ENDE PROBLEM */

                                    
    if($summe_km <= $circumcircle){
                                        echo 
    "<div class='div-container'><div class='singles-output'><br /><br /><span style='color: #d1b276'>Entfernung:</span> <span style='color: #545454'>".$summe_km."</span> <span style='color: #d1b276'>km</span><br /><br /><img src='".$row['image']."' style='border: 1px solid #d1b276; border-radius: 4px; width: 330px; height: 330px' alt='Singles'<br /><br /><br /><span style='color: #d1b276'>".$row['email']."</span></div></div>";            } /* else {
                                         echo " | Bitte erweitern Sie den Suchradius um m&ouml;gliche Treffer zu finden!<br />";
                                    }     */
                                
    }
                            }
                    }
                }
            }    
                
    fclose($handle);
            } 

  • #2
    Immerhin liegst du mit deiner Vermutung schonmal nicht schlecht

    Die richtige Vorgehensweise ist:
    Code:
    Ergebnisarray (leer) deklarieren.
    Schleife (Datenzeile holen)
        Dem Ergebnisarray Eintrag für Eintrag hinzufügen ("$resultArray[] = 'ein Eintrag'")
    Schleifenende
    Sortieren
    Ausgeben
    Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

    Kommentar


    • #3
      Ich hole mir Werte aus einer CSV und DB. Mit diesen Werten (Längen und Breitengrade) wird final die Entfernung zwischen zwei Orten berechnet. Das funkt soweit. Das Ergebnis der Berechnung soll in einem Array gespeichert werden. Ziel ist die Sortierung der Ergebnisse.
      Lad' dir die CSV doch einfach direkt in die Datenbank, z.B. als temporäre Tabelle, und lass die Entfernung von der Datenbank berechnen, dann kannst du auch gleich danach sortieren.
      [I]You know, my wife sometimes looks at me strangely. „Duncan“, she says, „there's more to life than Solaris“. Frankly, it's like she speaks another language. I mean, the words make sense individually, but put them together and it's complete nonsense.[/I]

      Kommentar


      • #4
        Ein Sortieren ist womöglich gar nicht notwendig, wenn du nur die kürzeste Entfernung (Minimum) für eine weitere Bearbeitung benötigst.
        Zu deinem Problem:
        Du must ein eindimensionales Array erstellen. Das geht vom Grundsatz so:
        PHP-Code:
        $distance = array();
         foreach (
        $pdo->query($sql) as $row) {
          
        //berechnung distanz
          
        $distance[] = $distanceValue;

        }
        //sortierung 
        Die Sortierung darf nicht in der Schleife, sondern muss danach erfolgen.

        Kommentar


        • #5
          Hi,

          an alle Antworten: mega Danke!!

          Das Berechnen via DB ist mir aktuell neu (Bin nur Mediengestalter). Schaue ich mir aber direkt an.

          Geholfen hat mir alles super! - und die Lösung von jspit habe ich eingebaut -> läuft!

          Ich freue mich wie verrückt

          Super lieben Dank!!

          Kommentar


          • #6
            Also die sortierte Ausgabe der aufsteigenden Km-Entfernung funktioniert. Das ist wirklich super!

            In diesem Kontext ergibt sich nun doch eine weitere Schwierigkeit.

            Aktuell und außerhalb der foreach kommt jetzt natürlich NUR die letzte Übergabe der Bilder und der E-Mail aus der DB mit und ist natürlich nicht synchron mit der Sortierung der Entfernungs-Kilometer.

            Ziel ist es, auch die Bilder und die eMail der Treffer mit aufsteigender Entfernung zu sortieren.

            Ist es möglich auf weitere Hilfe zu hoffen?

            Kann man das eventuell über mehrdimensionale Arrays bauen?

            Und dann via: array_multisort?



            PHP-Code:
            if($plz != "" AND $circumcircle != ""){
                        if ((
            $handle fopen("https://xxxxxxxxx.com/wp-content/plugins/customer-characteristics-pick-out/includes/csv/geodaten.csv""r")) !== FALSE) {
                            while ((
            $data fgetcsv($handle1000",")) !== FALSE) {
                                
            $num count($data);
                                for (
            $c=0$c $num$c++) {
                                    list(
            $csv_plz$csv_location$csv_latitude$csv_longitude) = explode(";"$data[$c]);
                                    if (
            $csv_plz == $plz){
                                        echo 
            "<br /><br />Die aktuell eingegebene PLZ: <span style='color: #545454'>".$plz."</span> gehört zu: <span style='color: #545454'>".$csv_location."</span>. Die Suche ergab mit einem Suchradius von:<span style='color: #545454'> ".$circumcircle."</span> km folgende Treffer:";
                                        
            $pdo = new PDO('mysql:host=xxxxxxxxx.de;dbname=xxxxxxxxx''xxxxxxxxx''xxxxxxxxx');
                                        
            $sql "SELECT latitude, longitude, email, image FROM customer_characteristics WHERE be_women_or_man='".$session_women_or_man."'";
                                        
            $distance = array();
                                        foreach (
            $pdo->query($sql) as $row) {
                                            
            $summe_km round(acos(sin(deg2rad($csv_latitude)) * sin(deg2rad($row['latitude'])) + cos(deg2rad($csv_latitude)) * cos(deg2rad($row['latitude'])) * cos(deg2rad($row['longitude']) - deg2rad($csv_longitude))) * 6380,2);
                                        
            $distance[] = $summe_km;
                                        }    
                                        
            sort ($distance);
                                        
            $anzahl count ($distance);
                                        echo 
            "<p>Es gibt $anzahl Einträge</p>";
                                        for (
            $x 0$x $anzahl$x++){
                                               echo 
            "$distance[$x]";
                                            if(
            $distance[$x] <= $circumcircle){

                                                
            /* AB HIER SOLLTE DIE AUSGABE DER BILDER UND EMAIL SYNCRON MIT SORTIERT AUSGEGEBEN WERDEN */

                                                
            echo "<div class='div-container'><div class='singles-output'><br /><br /><span style='color: #d1b276'>Entfernung:</span> <span style='color: #545454'>".$distance[$x]."</span> <span style='color: #d1b276'>km</span><br /><br /><img src='".$row['image']."' style='border: 1px solid #d1b276; border-radius: 4px; width: 330px; height: 330px' alt='Singles'<br /><br /><br /><span style='color: #d1b276'>".$row['email']."</span></div></div>";}
                                        }

                                    }
                            }
                        }
                    }    
                        
            fclose($handle);
                    } 

            Kommentar


            • #7
              Trenne doch bitte die Verarbeitung von der Ausgabe ab. Erst die DB abfragen und zum Schluss ausgeben, und nicht mittendrin noch Datenbankgefummel, wie du es derzeit hast.
              PHP-Code:
              echo "<br /><br />Die aktuell eingegebene PLZ: <span style='color: #545454'>".$plz."</span> gehört zu: <span style='color: #545454'>".$csv_location."</span>. Die Suche ergab mit einem Suchradius von:<span style='color: #545454'> ".$circumcircle."</span> km folgende Treffer:";
                                          
              $pdo = new PDO('mysql:host=xxxxxxxxx.de;dbname=xxxxxxxxx''xxxxxxxxx''xxxxxxxxx'); 
              Die ganzen Inlinestyle-Angaben gehören in eine CSS Datei und kannst du löschen.

              Bring das erst mal in Ordnung und dann zeigst du nur den Verarbeitungsteil. Ein echo wollen wir dann nicht mehr sehen.



              Kommentar


              • #8
                Wenn die Daten alle zusammengehören, und aus der DB kommen, rate ich noch mal dazu das gleich die DB sortieren zu lassen, damit sparst du dir langfristig eine Menge Arbeit. Aber du kannst dir natürlich jeder Zeit eine benutzerdefinierte Funktion schreiben, die zwei Datensätze vergleicht:

                http://php.net/usort
                [I]You know, my wife sometimes looks at me strangely. „Duncan“, she says, „there's more to life than Solaris“. Frankly, it's like she speaks another language. I mean, the words make sense individually, but put them together and it's complete nonsense.[/I]

                Kommentar


                • #9
                  Hi,

                  danke für Eure Antworten!

                  @ protestix: ich habe das Script soweit ich es vermag aufgeräumt (css, DB außerhalb und echo ist auch raus), d.h. sehr gerne zu Herzen genommen – super lieben Dank

                  @ chorn: ich hatte den Hinweis schon weiter oben zur Kenntnis genommen und würde es auch sehr gerne so umsetzten – aber ich bin mit der Formel via SQL nicht klar gekommen um die Entfernung zu berechnen. On top hatte ich vor ca. 14 Tagen beim Importieren der .CSV immer einen Abbruch in ca. dem ersten Drittel aller ca. 8000 Zeilen. Den Fehler, was mir phpMyAdmin ausgab, konnte ich damals nicht finden. In der CSV schaut es z.B. so aus (PLZ, ORT, Breitengrad, Längengrad):

                  01109;Dresden;51.1201;13.76.

                  Heute konnte ich aber die .CSV erfolgreich in SQL-DB importieren, d.h. ich scheitere um die Daten aus der DB sortiert zu holen an der SQL-Abfrage bzw. Formel

                  Ich habe hier dazu was gefunden: http://www.hgvision.de/27-umkreissuc...ordinaten.html

                  Ich bin davon völlig überzeugt, dass dieses der richtigere Ansatz wäre, deshalb habe ich den DB-Import heute noch einmal versucht.

                  Eventuell wäre es vor diesem neuen Hintergrund doch gut in die Sortierung mit der DB zu gehen.

                  Ich schaue mir aber die usort-Funktion unbedingt an!

                  Also noch Mal super lieben Dank an euch beide!!! Klasse - ist echt ein schönes Gefühl Hilfe zu bekommen!

                  Aktueller Code:

                  PHP-Code:
                  $distance = array();

                  foreach (
                  $pdo->query($sql) as $row) {
                      
                  $summe_km round(acos(sin(deg2rad($csv_latitude)) * sin(deg2rad($row['latitude'])) + cos(deg2rad($csv_latitude)) * cos(deg2rad($row['latitude'])) * cos(deg2rad($row['longitude']) - deg2rad($csv_longitude))) * 6380,2);
                      
                  $distance[] = $summe_km;
                  }

                  sort ($distance);
                  $anzahl count ($distance);

                  for (
                  $x 0$x $anzahl$x++){
                      
                  /* echo "$distance[$x]"; */
                      
                  if($distance[$x] <= $circumcircle){

                      
                  /*

                      AB HIER SOLLTE DIE AUSGABE IN FOLGENDEM FORMAT RAUSKOMMEN:

                      - ENTFERNUNGSKILOMENTER
                      - DAS ZUGEHÖRIGE IMAGE (URL ZUM IMAGE: KOMMT AUCH AUS DER DB)
                      - E-MAIL-ADRESE

                      DAS FUNKTIONIERTE ALLES BIS ZUR SORTIERUNG

                      */

                      
                  }                                

                  Kommentar

                  Lädt...
                  X