Vollpfosten: danke an das forum, kleines problem habe ich

Hallo,
ich habe unter www.vizacon.de/coop/php2.html ein postleitzahlensuchscript, das klappt schon ganz gut, vielen dank an das forum, aber es ist noch ein wenig zu ungenau
Beispiel: ich gebe 24105 ein und bekomme eine filiale in kiel und die restlichen sind nicht in kiel, obwohl es in kiel über 10 filialen gibt
hier das suchscript
...
<?php
$row = 1;
$diff = 10000;
$fp = fopen ("filialen.csv","r");
$stack_of_results=array();
while ($data = fgetcsv($fp, 1000, ";")) {
 if (abs($data[2] - $PLZ) < $diff) {
  $key=$diff;
  $stack_of_results[$key][]=$data; # Achtung $diff ist nicht unique, daher hier als ArrayOfArrays speichern
}
}
ksort($stack_of_results);
$output = array_slice ($stack_of_results, 0, 5);
$c=0;
foreach($output as $v){
  $c++;
}
echo "<tr>";
echo "<td>" . $v[1][0] . "</td>";
echo "<td>" . $v[1][1] . "</td>";
...
je nachdem, wie ich den wert $diff = 10000 größer oder kleiner mache, deste ungenauer bzw. genauer werden die ergebnisse, ich möchte aber von vornherein die besten ergebnisse haben,
lösungsvorschlag

  1. Huhu Vollpfosten

    das wird ja eine schwere Geburt ;-)

    poste doch bitte nochmal das komplette Skript, bzw. den Teil
    der die Treffer ausgibt.

    foreach($output as $v){
      $c++;
    }
    echo "<tr>";
    echo "<td>" . $v[1][0] . "</td>";
    echo "<td>" . $v[1][1] . "</td>";

    das kann so nicht funktionieren

    ?

    Viele Grüße

    lulu

    btw. sensible Daten solltest Du entweder ausserhalb des Webroots ablegen, oder auch einfach mit der Endung php (bzw. ggf. auch html o.ä)  versehen, damit man sie mit dem Browser nicht so einfach downloaden kann.
    In diesem Fall wenn die Informationen sowieso auf der Website gezeigt werden sollen ist es wohl unerheblich, aber sonst ...

    btw. 2

    du solltest auch nicht gleich einen weiteren thread starten, es ist sinnvoller und wird auch von vielen gerne gesehen wenn weitere Folge-Postings im Urpsrungsthread gepostet werden. (doofes denglisch)

    1. Die ausgabe sollte so erfolgen:
      <?php
      $row = 1;
      $fp = fopen ("filialen.csv","r");
      $max_diff = 20000;
      $stack_of_results=array();
      while ($data = fgetcsv($fp, 1000, ";")) {
       $diff=abs($data[2] - $PLZ) ;
       if ($diff < $max_diff) {
        $key=abs($data[2] - $PLZ);
        $result[$key][]=$data;
      }
      }
      ksort($stack_of_results);
      $output = array_slice ($stack_of_results, 0, 5);
      $c=0;
      foreach($output as $v){
        $c++;
      }
      echo "<tr>";
      echo "<td>" . $v[1][0] . "</td>";
      echo "<td>" . $v[1][2] . "</td>";
      echo "<td>" . $v[1][3] . "</td>";
      echo "<td>" . $v[1][3] . "</td>";
      echo "<td>" . $v[1][4] . "</td>";
      echo "<td>" . $v[1][5] . "</td>";
      echo "<td>" . $v[1][6] . "</td>";
      echo "<td>" . $v[1][7] . "</td>";
      echo "<td>" . $v[1][8] . "</td>";
      echo "<td>" . $v[1][9] . "</td>";
      echo "</tr>";

      Huhu Vollpfosten

      das wird ja eine schwere Geburt ;-)

      poste doch bitte nochmal das komplette Skript, bzw. den Teil
      der die Treffer ausgibt.

      foreach($output as $v){
        $c++;
      }
      echo "<tr>";
      echo "<td>" . $v[1][0] . "</td>";
      echo "<td>" . $v[1][1] . "</td>";

      das kann so nicht funktionieren

      ?

      Viele Grüße

      lulu

      btw. sensible Daten solltest Du entweder ausserhalb des Webroots ablegen, oder auch einfach mit der Endung php (bzw. ggf. auch html o.ä)  versehen, damit man sie mit dem Browser nicht so einfach downloaden kann.
      In diesem Fall wenn die Informationen sowieso auf der Website gezeigt werden sollen ist es wohl unerheblich, aber sonst ...

      btw. 2

      du solltest auch nicht gleich einen weiteren thread starten, es ist sinnvoller und wird auch von vielen gerne gesehen wenn weitere Folge-Postings im Urpsrungsthread gepostet werden. (doofes denglisch)

      1. Hallo,

        ich habe mir mal Deine Seite angesehen und ich glaube, dass deine Ausgabe nicht nach Abstand der PLZ, sondern alphabetisch nach Filialnamen sortiert ausgegeben wird. So siehst Du nur die ersten 5 im Alphabet. Du musst entweder Deine Sortierung ändern, oder die PLZ-Differenz solange vergrößern, bis Du z.B. 5 Treffer hast.

        Gruß,     Jürgen

        1. Das Scrip funktioniert so weit super, unter www.vizacon.de/coop/php.html gibt es eine neue version, aber ich habe noch 2 probleme:
          jetzt soll ich die möglichkeit bestehen nach vertriebslinien zu selektieren und dann die plz dazu einzugeben, im großen und ganzen kein problem,
          aber wenn ich alle vertriebslinien durchsuchen möchte und es gibt keine variable alle in Vertriebsl(das ist die erste Spalte in der .csv), was gebe ich da an,
          genauso gibt es Sky West, Ost und Ulm, ich möchte aber nur Sky in meiner Eingabemaske haben, er soll dann aber alle Skys durchsuchen, wie mach ich das

          Hallo,

          ich habe mir mal Deine Seite angesehen und ich glaube, dass deine Ausgabe nicht nach Abstand der PLZ, sondern alphabetisch nach Filialnamen sortiert ausgegeben wird. So siehst Du nur die ersten 5 im Alphabet. Du musst entweder Deine Sortierung ändern, oder die PLZ-Differenz solange vergrößern, bis Du z.B. 5 Treffer hast.

          Gruß,     Jürgen

  2. Huhu Torpfosten

    da war noch ein grober Fehler in der Logik drin.
    Das sollte jetzt aber funktionieren.

    <?php

    $PLZ=17000;
    $row = 1;
    $fp = fopen ("filialen.csv","r");
    $max_diff = 20000;
    $stack_of_results=array();
    while ($data = fgetcsv($fp, 1000, ";")) {
     $diff=abs($data[2] - $PLZ) ;
     if ($diff < $max_diff) {
      $key=abs($data[2] - $PLZ);
      $stack_of_results[$key][]=$data;
    }
    }
    ksort($stack_of_results);
    $output = array_slice ($stack_of_results, 0, 5);
    $c=0;
    foreach($output as $v){
      $c++;
      echo 'Ergebnis '.$c;
     foreach($v as $one){
      echo join(', ',$one).'<hr>';
     }
    }

    ?>

    Viele Grüße
       &
    have a nice day

    lulu