Sven Rautenberg: Verschachteltes Array übersichtlich füllen

Beitrag lesen

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