Alex_: Verschachteltes Array übersichtlich füllen

Hallo,

ich muss ein Array mit relativ vielen Werten in PHP füllen. Dies muss in großen Teilen manuell erfolgen, weshalb ich mir gerne möglichst viel Schreibarbeit sparen würde.

Angefangen habe ich in etwa so:

$array['spieler']['pkt']['bez'] = 'Punkte';
$array['spieler']['pkt']['wert'] = $points;
$array['spieler']['rd']['bez'] = 'Spielrunden';
$array['spieler']['rd']['wert'] = $rounds;
$array['spieler']['ppr']['bez'] = 'Punkte pro Runde';
if($array['spieler']['rd']['wert'] > 0) {
   $array['spieler']['ppr']['wert'] = round($points / $runde, 2);
} else {
   $array['spieler']['ppr']['wert'] = 0;
}
...

Nachdem mir das zu unübersichtlich wurde bzw. zu viel Copy&Paste und Schreibarbeit, habe ich auf den verzichtbaren assoziativen Key der zweiten Hierarchie verzichtet und es wie folgt umsetzen wollen (testbar geschrieben):

<?php
$points = 10;
$rounds = 2;
$array['spieler'] = array(
  array('bez' => 'Punkte', 'wert' => $points),
  array('bez' => 'Spielrunden', 'wert' => $rounds),
  if($rounds>0){array('bez' => 'Punkte pro Runde', 'wert' => $points/$rounds); } // Fehlermeldung: Parse error: syntax error, unexpected T_IF, expecting ')' in ... on line 7
);
print_r($array);
?>

Wie kann ich hier die obige if-Bedingung sinnvoll einbauen unter Beibehaltung der automatischen Indizierung und der verkürzten Schreibweise? Oder muss ich zwingend zunächst die automatische Indizierung mit der schließenden Klammer + Semikolon beenden und dann neu starten mit

if($rounds>0 {$array['spieler'][]['bez'] ...

obwohl ich die verkürzte Schreibweise doch gerade so liebgewonnen habe?

Eine Alternative die mir noch einfallen würde, wäre die if-Bedingungen und Berechnungen vor der Arrayerstellung durchzuführen und in Variablen zu speichern; würde aber auch mehr Schreibarbeit bedeuten und die Berechnungen wären an ganz anderer Stelle im Script (unübersichtlicher?).

Freundliche Grüße Alex_

  1. Moin!

    Hallo,

    ich muss ein Array mit relativ vielen Werten in PHP füllen. Dies muss in großen Teilen manuell erfolgen, weshalb ich mir gerne möglichst viel Schreibarbeit sparen würde.

    Angefangen habe ich in etwa so:

    $array['spieler']['pkt']['bez'] = 'Punkte';
    $array['spieler']['pkt']['wert'] = $points;
    $array['spieler']['rd']['bez'] = 'Spielrunden';
    $array['spieler']['rd']['wert'] = $rounds;
    $array['spieler']['ppr']['bez'] = 'Punkte pro Runde';
    if($array['spieler']['rd']['wert'] > 0) {
       $array['spieler']['ppr']['wert'] = round($points / $runde, 2);
    } else {
       $array['spieler']['ppr']['wert'] = 0;
    }
    ...
    

    Nachdem mir das zu unübersichtlich wurde bzw. zu viel Copy&Paste und Schreibarbeit, habe ich auf den verzichtbaren assoziativen Key der zweiten Hierarchie verzichtet und es wie folgt umsetzen wollen (testbar geschrieben):

    <?php
    $points = 10;
    $rounds = 2;
    $array['spieler'] = array(
      array('bez' => 'Punkte', 'wert' => $points),
      array('bez' => 'Spielrunden', 'wert' => $rounds),
      if($rounds>0){array('bez' => 'Punkte pro Runde', 'wert' => $points/$rounds); } // Fehlermeldung: Parse error: syntax error, unexpected T_IF, expecting ')' in ... on line 7
    );
    print_r($array);
    ?>
    

    Wie kann ich hier die obige if-Bedingung sinnvoll einbauen unter Beibehaltung der automatischen Indizierung und der verkürzten Schreibweise? Oder muss ich zwingend zunächst die automatische Indizierung mit der schließenden Klammer + Semikolon beenden und dann neu starten mit

    if($rounds>0 {$array['spieler'][]['bez'] ...
    

    obwohl ich die verkürzte Schreibweise doch gerade so liebgewonnen habe?

    Der ternäre Operator dürfte hier helfen, und er wäre auch sachgerecht, weil er die Bildung eines Wertes durch eine Bedingung steuert.

    Also sowas hier:

    <?php
    $points = 10;
    $rounds = 2;
    $array['spieler'] = array(
      array('bez' => 'Punkte', 'wert' => $points),
      array('bez' => 'Spielrunden', 'wert' => $rounds),
      ($rounds > 0? array('bez' => 'Punkte pro Runde', 'wert' => $points/$rounds) : array()),
    );
    print_r($array);
    ?>
    

    Angucken:

    $runden = 2: http://3v4l.org/uZqp3 $runden = 0: http://3v4l.org/NNEbH

    Der Alternativwert für "runden <= 0" wäre noch zu überlegen. Leer lassen würde ich das Array an dieser Stelle nicht, d.h. es sollte ebenfalls einen Key "bez" und "wert" bekommen, nur halt passend für diese Situation.

    Grüße Sven

    1. Moin Sven!

      <?php
      $points = 10;
      $rounds = 2;
      $array['spieler'] = array(
        array('bez' => 'Punkte', 'wert' => $points),
        array('bez' => 'Spielrunden', 'wert' => $rounds),
        ($rounds > 0? array('bez' => 'Punkte pro Runde', 'wert' => $points/$rounds) : array()),
      );
      print_r($array);
      ?>
      

      Vielen Dank für deine Antwort. Die vorgeschlagene Lösung gefällt mir sehr gut und ich werde die verwenden.

      Nachrichtlich dennoch: Ich habe mir inzwischen auch nochmal Gedanken gemacht und selbst folgende Lösung überlegt, da die es sich bei den berechneten Werten fast immer um eine Division handelt:

      <?php
      //Funktion
      function getQuote($dividend,$divisor) {
         if($divisor!=0) {
            $quotient = $dividend / $divisor;
         } else {
            $quotient = 0; //Mathematisch falsch, aber hier passend
         }
         return $quotient;
      }
      
      
      $points = 10;
      $rounds = 2;
      $array['spieler'] = array(
        array('bez' => 'Punkte', 'wert' => $points),
        array('bez' => 'Spielrunden', 'wert' => $rounds),
        array('bez' => 'Punkte pro Runde', 'wert' => getQuote($points,$rounds))
      );
      print_r($array);
      ?>
      

      Der Alternativwert für "runden <= 0" wäre noch zu überlegen. Leer lassen würde ich das Array an dieser Stelle nicht, d.h. es sollte ebenfalls einen Key "bez" und "wert" bekommen, nur halt passend für diese Situation.

      Diese Situation habe ich mir auch schon überlegt (siehe obigen Kommentar). Vlt. werde ich hier aber auch noch eine andere Rückgabe (evtl. NULL) einbauen.

      1. Hallo

        Der Alternativwert für "runden <= 0" wäre noch zu überlegen. Leer lassen würde ich das Array an dieser Stelle nicht, d.h. es sollte ebenfalls einen Key "bez" und "wert" bekommen, nur halt passend für diese Situation.

        Diese Situation habe ich mir auch schon überlegt (siehe obigen Kommentar). Vlt. werde ich hier aber auch noch eine andere Rückgabe (evtl. NULL) einbauen.

        Wenn du hier NULL zurückgibst, musst du an anderer Stelle eine Prüfung einbauen, die auf diesen vom Standardverhalten abweichenden Wert NULL reagiert. Da du offensichtlich eine Ausgabe generieren willst, solltest du es dir nicht schwerer als notwendig machen. Wenn der Spieler bisher keine Runde gespielt hat, ist die Anzahl der Punkte pro Runde 0. Das kannst du auch einfach so reinschreiben und gut is.

           ($rounds > 0 ? array('bez' => 'Punkte pro Runde', 'wert' => getQuote($points,$rounds)) : array('bez' => 'Punkte pro Runde', 'wert' => 0)),
        

        Tschö, Auge

        --
        Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war. Terry Pratchett, “Wachen! Wachen!