PHP-Funktion gesucht

Torsten Ernst

Mitglied
Hallo,

da man mir hier immer gut geholfen hat, hoffe ich auch diesmal auf Unterstützung. Ich lese eine XML-Datei aus und stelle die Daten grafisch in einer Google Map dar. Hier mal ein kleiner Ausschnitt aus meinem Code:

PHP:
while ($xml->activeReceiver[$activeReceiver])
{
$freq=($xml->activeReceiver[$activeReceiver]->attributes()->frequency);

if ($freq==        0) { $band="<i>(no data available)</i>"; }
if ($freq>=   400000) { $band="600m"; }
if ($freq>=  1000000) { $band="160m"; }
if ($freq>=  3000000) { $band="80m";  }
if ($freq>=  6000000) { $band="40m";  }
if ($freq>=  8000000) { $band="30m";  }
if ($freq>= 12000000) { $band="20m";  }
if ($freq>= 16000000) { $band="17m";  }
if ($freq>= 19000000) { $band="15m";  }
if ($freq>= 22000000) { $band="12m";  }
if ($freq>= 26000000) { $band="10m";  }
if ($freq>= 31000000) { $band="6m";   }
if ($freq>=550000000) { $band="2m";   }

if ($band=="600m") $band600++;
if ($band=="160m") $band160++;
if ($band== "80m") $band80++;
if ($band== "40m") $band40++;
if ($band== "30m") $band30++;
if ($band== "20m") $band20++;
if ($band== "17m") $band17++;
if ($band== "15m") $band15++;
if ($band== "12m") $band12++;
if ($band== "10m") $band10++;
if ($band==  "6m") $band6++;
if ($band==  "2m") $band2++;

if ($band=="600m") $pin = "images/bullet_magenta.png";
if ($band=="160m") $pin = "images/bullet_brown.png";
if ($band=="80m") $pin = "images/bullet_hgreen.png";
if ($band=="40m") $pin = "images/bullet_purple.png";
if ($band=="30m") $pin = "images/bullet_green.png";
if ($band=="20m") $pin = "images/bullet_red.png";
if ($band=="17m") $pin = "images/bullet_blue.png";
if ($band=="15m") $pin = "images/bullet_yellow.png";
if ($band=="12m") $pin = "images/bullet_orange.png";
if ($band=="10m") $pin = "images/bullet_cyan.png";
if ($band=="6m") $pin = "images/bullet_white.png";
if ($band=="2m") $pin = "images/bullet_black.png";

Für alle Bänder werden Pins in verschieden Farben durch die Variable $band angezeigt. Nun zu meinem Vorhaben. Der User soll neben der Anzeige aller Bänder auch die Möglichkeit besitzen nur jeweils ein Band anzeigen zu lassen, also 20, 10, 15 usw. Der Link könnte dann so aussehen http://www.domain.band.php&band=20m oder so ähnlich. Gibt es dafür eine Funktion und wo müßte ich ansetzen? Ich bin totaler Anfänger und würde ansonsten für jedes Band eine separate Datei erstellen. Aber das wäre wohl Unfug denn ich weiß das es irgendwie geht, nur wie? Ich hoffe auf hilfreiche Antworten.

MfG, Torsten
 
Hi

wenn du wie gezeigt mit &band=20m aufrufst findest du das 20m in der Variable
$_GET['band']

Man sollte allerdings
a) am Anfang prüfen, ob überhaupt etwas übergeben wurde
(dann kann man ja immer noch alle Bänder anzeigen, oder eine Fehlermeldung zeigen etc....)
PHP:
if(!isset($_GET['band']))
{
    //Nichts übergeben
}
b) nicht darauf verlassen, dass da ein gültiger Wert übergeben wird.
So, programmieren, dass zB. bei diesen viele if´s am Schluss
ein else mit Fehelrmeldung etc. steht. Nicht den Wert einfach so schlucken.
Beim gezeigten Code würde dann zB. kein if ausgeführt,
die Variable nicht gesetzt -> später Probleme.


Zu den vielen if´s: Schau dir Arrays/Assoziative Arrays an.
Zusammen mit Schleifen könnten die viel Schreibarbeit ersparen.
 
Erst einmal vielen Dank für deine Antwort. Ich habe nun noch einmal nach der Funktion $_GET im Internet recherchiert. Ich verstehe es trotzdem nicht, sorry aber ich kapier es einfach nicht. Ist wohl doch noch eine Nummer zu hoch für mich. Ich habe noch einmal den Code durchgesehen. Im Prinzip wird nur $pin an die Google Map übergeben. Und dann werden entsprechende Icons in unterschiedlichen Farben angezeigt. Wie weise ich die Funktion $_GET denn den Pins zu oder liege ich total verkehrt? Ich bitte um Rücksicht, bin wie gesagt noch totaler Newbie.

MfG, Torsten

Ich habe es nun so probiert, funktioniert aber leider nicht. Ist denn meine Denkweise wenigstens richtig?

PHP:
//if ($band=="600m") $pin = "images/bullet_magenta.png";
//if ($band=="160m") $pin = "images/bullet_brown.png";
//if ($band=="80m") $pin = "images/bullet_hgreen.png";
//if ($band=="40m") $pin = "images/bullet_purple.png";
//if ($band=="30m") $pin = "images/bullet_green.png";
//if ($band=="20m") $pin = "images/bullet_red.png";
//if ($band=="17m") $pin = "images/bullet_blue.png";
//if ($band=="15m") $pin = "images/bullet_yellow.png";
//if ($band=="12m") $pin = "images/bullet_orange.png";
//if ($band=="10m") $pin = "images/bullet_cyan.png";
//if ($band=="6m") $pin = "images/bullet_white.png";
//if ($band=="2m") $pin = "images/bullet_black.png";

$farbe = $_GET['farbe'];

if ($band=="600m") $pin = "images/bullet_$farbe.png";
if ($band=="160m") $pin = "images/bullet_$farbe.png";
if ($band=="80m") $pin = "images/bullet_$farbe.png";
if ($band=="40m") $pin = "images/bullet_$farbe.png";
if ($band=="30m") $pin = "images/bullet_$farbe.png";
if ($band=="20m") $pin = "images/bullet_$farbe.png";
if ($band=="17m") $pin = "images/bullet_$farbe.png";
if ($band=="15m") $pin = "images/bullet_$farbe.png";
if ($band=="12m") $pin = "images/bullet_$farbe.png";
if ($band=="10m") $pin = "images/bullet_$farbe.png";
if ($band=="6m") $pin = "images/bullet_$farbe.png";
if ($band=="2m") $pin = "images/bullet_$farbe.png";

Aufgerufen habe ich jetzt mal mit http://www.domain.de/band.php&farbe=yellow

MfG, Torsten

Bin nun schon ein Stück weiter. Wenn ich mit

http://www.domain.de/band.php?farbe=yellow

aufrufe klappt es. Ich kann nun jede Farbe einzeln anzeigen lassen. Aber wie mache ich es jetzt wieder alle Farben anzeigen zu lassen?

MfG, Torsten
 
PHP:
$farbe = $_GET['farbe'];

if ($band=="600m") $pin = "http://www.tutorials.de/images/bullet_$farbe.png";
if ($band=="160m") $pin = "http://www.tutorials.de/images/bullet_$farbe.png";
if ($band=="80m") $pin = "http://www.tutorials.de/images/bullet_$farbe.png";
if ($band=="40m") $pin = "http://www.tutorials.de/images/bullet_$farbe.png";
if ($band=="30m") $pin = "http://www.tutorials.de/images/bullet_$farbe.png";
if ($band=="20m") $pin = "http://www.tutorials.de/images/bullet_$farbe.png";
if ($band=="17m") $pin = "http://www.tutorials.de/images/bullet_$farbe.png";
if ($band=="15m") $pin = "http://www.tutorials.de/images/bullet_$farbe.png";
if ($band=="12m") $pin = "http://www.tutorials.de/images/bullet_$farbe.png";
if ($band=="10m") $pin = "http://www.tutorials.de/images/bullet_$farbe.png";
if ($band=="6m") $pin = "http://www.tutorials.de/images/bullet_$farbe.png";
if ($band=="2m") $pin = "http://www.tutorials.de/images/bullet_$farbe.png";

Der Code macht überhaupt keinen Sinn, weil du in jeder IF-Abfrage den selben Code-teil stehen hast. Außerdem überprüfst du die Uservariable $_GET['farbe'] nicht, da könnte also alles mögliche drinstehen.

Schauen wir uns deinen 1. Code doch noch einmal an.

PHP:
while ($xml->activeReceiver[$activeReceiver]) 
{ 
$freq=($xml->activeReceiver[$activeReceiver]->attributes()->frequency); 
// Hier setzt du die Variable $band
if ($freq==        0) { $band="<i>(no data available)</i>"; } 
if ($freq>=   400000) { $band="600m"; } 
if ($freq>=  1000000) { $band="160m"; } 
if ($freq>=  3000000) { $band="80m";  } 
if ($freq>=  6000000) { $band="40m";  } 
if ($freq>=  8000000) { $band="30m";  } 
if ($freq>= 12000000) { $band="20m";  } 
if ($freq>= 16000000) { $band="17m";  } 
if ($freq>= 19000000) { $band="15m";  } 
if ($freq>= 22000000) { $band="12m";  } 
if ($freq>= 26000000) { $band="10m";  } 
if ($freq>= 31000000) { $band="6m";   } 
if ($freq>=550000000) { $band="2m";   } 

// Hier prüfst du die eben gesetzte Variable

if ($band=="600m") $band600++; 
if ($band=="160m") $band160++; 
if ($band== "80m") $band80++; 
if ($band== "40m") $band40++; 
if ($band== "30m") $band30++; 
if ($band== "20m") $band20++; 
if ($band== "17m") $band17++; 
if ($band== "15m") $band15++; 
if ($band== "12m") $band12++; 
if ($band== "10m") $band10++; 
if ($band==  "6m") $band6++; 
if ($band==  "2m") $band2++; 

// Und hier gleich nocheinmal
if ($band=="600m") $pin = "http://www.tutorials.de/images/bullet_magenta.png"; 
if ($band=="160m") $pin = "http://www.tutorials.de/images/bullet_brown.png"; 
if ($band=="80m") $pin = "http://www.tutorials.de/images/bullet_hgreen.png"; 
if ($band=="40m") $pin = "http://www.tutorials.de/images/bullet_purple.png"; 
if ($band=="30m") $pin = "http://www.tutorials.de/images/bullet_green.png"; 
if ($band=="20m") $pin = "http://www.tutorials.de/images/bullet_red.png"; 
if ($band=="17m") $pin = "http://www.tutorials.de/images/bullet_blue.png"; 
if ($band=="15m") $pin = "http://www.tutorials.de/images/bullet_yellow.png"; 
if ($band=="12m") $pin = "http://www.tutorials.de/images/bullet_orange.png"; 
if ($band=="10m") $pin = "http://www.tutorials.de/images/bullet_cyan.png"; 
if ($band=="6m") $pin = "http://www.tutorials.de/images/bullet_white.png"; 
if ($band=="2m") $pin = "http://www.tutorials.de/images/bullet_black.png";

Du machst hier vieles doppelt, sogar dreifach. Am besten kann man das ins erste IF hinein schreiben:
PHP:
while ($xml->activeReceiver[$activeReceiver]) { 
  $freq=($xml->activeReceiver[$activeReceiver]->attributes()->frequency);   
  if ($freq==        0) { 
    $band="<i>(no data available)</i>"; 
  } 
  if ($freq>=   400000) { 
    $band="600m"; 
    $band600++;
    $pin = "http://www.tutorials.de/images/bullet_magenta.png";
  } 
  if ($freq>=  1000000) { 
    $band="160m";
    $band160++; 
    $pin = "http://www.tutorials.de/images/bullet_brown.png"
  } 
// Den Rest kannst du dann machen ;) ...

Eine weitere Optimierung ist es nun, gleiche Codeteile auszulagern, und den dynamischen Teil durch Variablen zu ersetzen (ähnlich wie du es schon versucht hast). Außerdem, kann man wie sheel schon vorgeschlagen hat, assoziative Arrays und Schleifen einsetzen. Insgesamt als Beispiel:

PHP:
// Multidimensionales Array (2D)
$data = array(
  "freq" => array(
    0 => "<i>(no data available)</i>",
    4 => "600m", //Wir in der Schleife mit 10^5 multipliziert
    10 => "160m",
    30 => "80m"
  ),
  "color" => array("", "magenta", "brown", "hgreen"),
  "band" => array("600m" => 0, "160m" => 0, "80m" => 0) // Initialisierung für die $band160 etc Variablen
);
$keys = array_keys($data["freq"]);
$size = sizeof($data["freq"]);
while ($xml->activeReceiver[$activeReceiver]) { 
  $freq=($xml->activeReceiver[$activeReceiver]->attributes()->frequency);
  for( $i = $size-1; $i >= 0; $i-- ){ //Array von hinten durchlaufen
    if( $freq >= $keys[$i]*10000 ){
      $band = $data["freq"][$keys[$i]];
      $pin = "http://www.tutorials.de/images/bullet_".$data["color"][$i]".png";
      $band_array[$band]++;
      break;
    }
  }
}

Da kannste dich jetzt mal ein wenig einlesen :)
 
Vielen Dank für deine ausführliche Erklärung. Ich habe gestern noch die halbe Nacht dran gesessen und auch gemerkt das meine gemeldeten "Fortschritte" ein Schuß in den Ofen waren.

Folgende Lösungen hatte ich mir in meiner Verzweiflung ausgedacht:

1. Ansicht aller Bänder: (Die Farbicons habe ich in das entsprechende Band umbenannt, also statt bullet_red.png jetzt bullet_20m.png usw.)

PHP:
while ($xml->activeReceiver[$activeReceiver])
{
$freq=($xml->activeReceiver[$activeReceiver]->attributes()->frequency);

if ($freq==        0) { $band="<i>(no data available)</i>"; }
if ($freq>=   400000) { $band="600m"; }
if ($freq>=  1000000) { $band="160m"; }
if ($freq>=  3000000) { $band="80m";  }
if ($freq>=  6000000) { $band="40m";  }
if ($freq>=  8000000) { $band="30m";  }
if ($freq>= 12000000) { $band="20m";  }
if ($freq>= 16000000) { $band="17m";  }
if ($freq>= 19000000) { $band="15m";  }
if ($freq>= 22000000) { $band="12m";  }
if ($freq>= 26000000) { $band="10m";  }
if ($freq>= 31000000) { $band="6m";   }
if ($freq>=550000000) { $band="2m";   }

if ($band=="600m") $band600++;
if ($band=="160m") $band160++;
if ($band== "80m") $band80++;
if ($band== "40m") $band40++;
if ($band== "30m") $band30++;
if ($band== "20m") $band20++;
if ($band== "17m") $band17++;
if ($band== "15m") $band15++;
if ($band== "12m") $band12++;
if ($band== "10m") $band10++;
if ($band==  "6m") $band6++;
if ($band==  "2m") $band2++;

$pin = "images/bullet_$band.png";


2. Ansicht einzelner Bänder: (Ich habe ein transparentes Icon Namens bullet_emty.png hinzugefügt, es ist voll transparent)

PHP:
while ($xml->activeReceiver[$activeReceiver])
{
$freq=($xml->activeReceiver[$activeReceiver]->attributes()->frequency);

if ($freq==        0) { $band="<i>(no data available)</i>"; }
if ($freq>=   400000) { $band="600m"; }
if ($freq>=  1000000) { $band="160m"; }
if ($freq>=  3000000) { $band="80m";  }
if ($freq>=  6000000) { $band="40m";  }
if ($freq>=  8000000) { $band="30m";  }
if ($freq>= 12000000) { $band="20m";  }
if ($freq>= 16000000) { $band="17m";  }
if ($freq>= 19000000) { $band="15m";  }
if ($freq>= 22000000) { $band="12m";  }
if ($freq>= 26000000) { $band="10m";  }
if ($freq>= 31000000) { $band="6m";   }
if ($freq>=550000000) { $band="2m";   }

if ($band=="600m") $band600++;
if ($band=="160m") $band160++;
if ($band== "80m") $band80++;
if ($band== "40m") $band40++;
if ($band== "30m") $band30++;
if ($band== "20m") $band20++;
if ($band== "17m") $band17++;
if ($band== "15m") $band15++;
if ($band== "12m") $band12++;
if ($band== "10m") $band10++;
if ($band==  "6m") $band6++;
if ($band==  "2m") $band2++;

$bandeingabe = $_GET['band'];
if ($band==$bandeingabe) {$pin = "images/bullet_$bandeingabe.png";} else {$pin = "images/bullet_emty.png";}

Beide Varianten funktionieren für sich betrachtet. Nur beides zusammen habe ich noch nicht unter einen Hut bekommen, ich war irgendwann zu müde und mochte auch nicht mehr. Ich hatte gestern Abend auch schon überlegt mir einen PHP-Freelancer zu suchen, ich kann nicht Tagelang vor der Kiste sitzen um mir dann immer wieder einzugestehen das ich für PHP zu doof bin. Für Profis ist das sicherlich alles Murks aber ich als Anfänger bin einfach nur froh wenn es irgendwie läuft.

Ich habe die beiden Varianten von timestamp jetzt getestet. Die erste verstehe ich, aber leider stimmen die Werte für die Variablen $band600, $band160 usw. nicht mehr. Keine Ahnung wie die Werte zustande kommen aber sie sind falsch. Das war der Code:

PHP:
while ($xml->activeReceiver[$activeReceiver])
{
$freq=($xml->activeReceiver[$activeReceiver]->attributes()->frequency);

if ($freq==        0) {
$band="<i>(no data available)</i>";
}
if ($freq>=   400000) {
$band="600m";
$band600++;
$pin = "images/bullet_600m.png";
}
if ($freq>=  1000000) {
$band="160m";
$band160++;
$pin = "images/bullet_160m.png";
}
if ($freq>=  3000000) {
$band="80m";
$band80++;
$pin = "images/bullet_80m.png";
}
if ($freq>=  6000000) {
$band="40m";
$band40++;
$pin = "images/bullet_40m.png";
}
if ($freq>=  8000000) {
$band="30m";
$band30++;
$pin = "images/bullet_30m.png";
}
if ($freq>= 12000000) {
$band="20m";
$band20++;
$pin = "images/bullet_20m.png";
}
if ($freq>= 16000000) {
$band="17m";
$band17++;
$pin = "images/bullet_17m.png";
}
if ($freq>= 19000000) {
$band="15m";
$band15++;
$pin = "images/bullet_15m.png";
}
if ($freq>= 22000000) {
$band="12m";
$band12++;
$pin = "images/bullet_12m.png";
}
if ($freq>= 26000000) {
$band="10m";
$band10++;
$pin = "images/bullet_10m.png";
}
if ($freq>= 31000000) {
$band="6m";
$band6++;
$pin = "images/bullet_6m.png";
}
if ($freq>=550000000) {
$band="2m";
$band2++;
$pin = "images/bullet_2m.png";
}

Die zweite Variante ist wohl der Stand der Dinge aber da verstehe ich nicht wirklich viel, sorry. Ich habe sie aber getestet erhalte leider eine Fehlermeldung, in etwa so:

Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING....

Optimal wäre für mich die Variante mit der zusammengefassten if-Anweisung von timestamp und wenn ich beide Ansichtsvarianten (alle Bänder, einzelne Bänder) hinbekommen würde. Die Hoffnung stirbt bekanntlic zu letzt...

MfG, Torsten
 
Zurück