Wert in einem Array hochzählen

Eiszwerg

Erfahrenes Mitglied
Moin Community,

aktuell versuche ich krampfhaft Konfigurationsdateien von mehreren Gameservern auszuwerten.

In diesen Dateien stehen verschiedene Settings, deren Wert unterschiedlich sein kann. Ich möchte mir nun die Namen der Settings und deren Werte pro Datei schnappen und später eine Auswertung erstellen, welche Werte wie häufig vorkommen - folglich eine kleine Statistik.

Dazu dachte ich mir, baue ich erstmal ein Array von den Werten, die mich interessieren.

Das sieht aktuell so aus:

PHP:
$wantedGamePref[] = array('gamepref' => "DropOnDeath",
                          'values'   => array(0,1,2),
                          'count'  => array(0,0,0));
                        
$wantedGamePref[] = array('gamepref' => "AirDropFrequency",
                          'values'   => array(8,12,24),
                          'count'  => array(0,0,0));

$wantedGamePref[] = array('gamepref' => "LandClaimDeadZone",
                          'values'   => array(10,20,30,40,50),
                          'count'  => array(0,0,0,0,0));
                        
$wantedGamePref[] = array('gamepref' => "LandClaimDecayMode",
                          'values'   => array(0,1,2),
                          'count'  => array(0,0,0));

Es gibt also das Feld "gamepref" in welchem je ein gesuchter Settings-Wert steht (ich will nicht alle Settings erfassen).
Weiterhin habe ich ein verschachteltes Array "values" inwelchem die möglichen Werte stehen, die man im Spiel auswählen kann.
Zu guter Letzt habe ich das Feld "count" als Array hinzugefügt, weil ich - und das mag vermutlich mein Denkfehler sein - dort das Vorkommen der einzelnen "values" hochzählen wollte.

Mein Problem - ihr habt es sicher schon gemerkt - ist die Tatsache, dass ich absoluter Neuling im Bereich Arrays bin.

Mein Plan war nun, die Konfig einzulesen, und das aktuelle Setting gegen das Array zu werfen, um zu prüfen, ob ich das Setting auswerten möchte.
Das klappt auch wunderbar.
Hab ich dabei einen Treffer, prüft das Skript, ob der Wert aus der Datei im Array "values" vorkommt.
Funktioniert eigtl. auch.
Doch dann will ich meinen Zähler für diesen Wert inkrementieren und bekomme es um's Verrecken nicht hin.

Aktueller Testcode hierfür:
PHP:
$testGamePref= "LandClaimDeadZone";
$testValue = 10;

foreach ($wantedGamePref as $countGamePref => $content)
{
  if ($content["gamepref"]==$testGamePref)
  {
    echo "GamePref matched!<br>";
    foreach ($content["values"] as $countValue => $value)
    {
      if ($value==$testValue) echo "Value matched!<br>";
      $content["gamepref"][$countValue]=$content["gamepref"][$countValue]+1; //Hier hakt es
    }
  }  
}

Ich hoffe, dass ihr mich mir einen Tipp geben könnt, wo ich was falsch mache.
Ich werde das dumpfe Gefühl nicht los, dass ich zu kompliziert denke.

Vielen vielen Dank :)
 
da fehlt ein ['count'] um in das richtige Unterarray zu kommen.

Um sowetwas zu vermeiden, empfiehlt es sich, als aller erstes ein print_r oder var_dump auf die Variable zu werfen, um zu sehen wo du arbeitest.
Der Tipp ist schön universell und sollte man sich auf die Stirn schreiben :p


Weiter könntest du dein Array Optimieren, und anstatt der gesuchten Values ein Array da rein setzten welches aus 0 => Value und 1 => Anzahl besteht. Damit sparst du dir einen Schritt/Variable.
 
Danke für die rasche Antwort :)
Ja, den Tipp kenne ich, berücksichtige ihn aber leider so gut wie. "Dran denken" sollte auf meiner Stirn stehen :D

Nun muss ich mal schauen, wo ich das böse ['count'] hinbastel.
So ganz kann ich leider noch nicht folgen.
 
Ich bin offenbar echt zu schwer von Begriff.
Hier nochmal mein aktueller Testcode:

PHP:
$wantedGamePref[] = array('gamepref' => "DropOnDeath",
                          'values'   => array(0,1,2),
                          'count'  => array(0,0,0));

$testGamePref[]= "DropOnDeath";
$testValue[]= 0;

$testGamePref[]= "DropOnDeath";
$testValue[]= 1;

$testGamePref[]= "DropOnDeath";
$testValue[]= 2;

$testGamePref[]= "DropOnDeath";
$testValue[]= 2;



for ($i=0, $c=count($testGamePref); $i<$c; $i++)
{
  foreach ($wantedGamePref as $keyGamePref => $content)
  {
    if ($testGamePref[$i]==$content["gamepref"])
    {
      echo "GamePref <strong>".$content["gamepref"]."</strong> matched!<br>";
   
      foreach ($content["values"] as $keyValue => $value)
      {
        if ($testValue[$i]==$value)
        {
          echo "Value <strong>".$value."</strong> matched!<br>";
       
          foreach ($content["count"] as $keyCount => $count)
          {
            $content["count"][$keyCount]+=1;
            echo $content["count"][$keyCount];
          }
       
        }
      }
   
    }
  } echo "<br>";
}

Aktuell lautet die Ausgabe:
Code:
GamePref DropOnDeath matched!
Value 0 matched!
111
GamePref DropOnDeath matched!
Value 1 matched!
111
GamePref DropOnDeath matched!
Value 2 matched!
111
GamePref DropOnDeath matched!
Value 2 matched!
111

Erwartet hatte ich:
Code:
GamePref DropOnDeath matched!
Value 0 matched!
100
GamePref DropOnDeath matched!
Value 1 matched!
110
GamePref DropOnDeath matched!
Value 2 matched!
111
GamePref DropOnDeath matched!
Value 2 matched!
112
Mag bitte nochmal jemand helfend eingreifen?
Danke :)
 
Mach doch einmal in jedem deiner Schleifen ein print_r um das Array welches du betrachtest/bearbeitest. Auf die schnelle seh ich nichts, aber ich hab es weder getestet noch ein zweites mal gelesen.

Es scheint, dass du alles mmit der selben Zahl setzt oder immer neu bei 100 anfängst zu zählen. Lösbar sollte das wirklich durch genaues betrachten sein, geh sicher, dass in jedem Schritt exakt das geschieht was du dir vorstellst.
 
Joarr nee.
Hab mir det alles mir print_r mal angeschaut und soweit sieht's für mich richtig aus.

Sehe wohl den Wald vor lauter Bäumen nicht.
Hab zwischenzeitlich genug Zeit in den Versuch gesteckt und schmeiss nun hin.

Dennoch danke für die Mühe!
 
Das ist natürlich schade zu hören, da es bestimmt nur ein kleiner Denkfehler ist (wäre es nicht so, hätte ich wohl einen Fehler gesehen).

Falls du es doch noch machen möchtest, würde ich empfehlen einfach nochmal die Schleifen zu schreiben (ohne spickeln!). Hilft mir normalerweise immer, da man dann evt. einen anderen Fehler macht - oder sogar keinen.
 
Ja, mich nervt es auch ungemein und daher habe ich jetzt nochmal komplett umgebaut.

Soweit ich es mitbekommen habe, ist das Problem, dass der hochgezählte Wert nicht dauerhaft ins Array zurückgeschrieben wird, sondern nur für den einen Durchlauf der Schleife.

Hier mein letzter Ansatz - vielleicht mag nochmal jemand schauen:
PHP:
<?php

//welche GamePrefs wollen wir erfassen, welche Werte sind erlaubt?
$wantedGamePref[] = array('gamepref' => "DropOnDeath", 
                          'values'   => "0,1,2",    
                          'count'  => "0,0,0");      
                         
$wantedGamePref[] = array('gamepref' => "AirDropFrequency",
                          'values'   => "8,12,24",
                          'count'  => "0,0,0");

$wantedGamePref[] = array('gamepref' => "LandClaimDeadZone",
                          'values'   => "10,20,30,40,50",
                          'count'  => "0,0,0,0,0");
                         
$wantedGamePref[] = array('gamepref' => "LandClaimDecayMode",
                          'values'   => "0,1,2",
                          'count'  => "0,0,0");

                       

//ein paar Testdaten zum durchlaufen.
$testGamePref[]= "AirDropFrequency";
$testValue[]= 8;

$testGamePref[]= "AirDropFrequency";
$testValue[]= 12;

$testGamePref[]= "AirDropFrequency";
$testValue[]= 12;

$testGamePref[]= "AirDropFrequency";
$testValue[]= 24;



for ($i=0, $c=count($testGamePref); $i<$c; $i++)
{
  foreach ($wantedGamePref as $keyGamePref => $content)
  {
    if ($testGamePref[$i]==$content["gamepref"])
    {
      echo $content["gamepref"]."<br>";
      $values=explode(",",$content["values"]);
      for ($j=0, $z=count($values); $j<$z; $j++)
      {
        if ($testValue[$i]==$values[$j])
        {
          $counters=explode(",",$content["count"]);
          $counters[$j]++;
          $counters=implode(",",$counters);
          $newArray=array('gamepref' =>$content["gamepref"],
                          'values'   => $content["values"],
                          'count'  => $counters);
          var_dump($newArray);
          array_replace($content,$newArray);
         
          echo $testValue[$i]." matches ".$values[$j].". Counter goes one up ".$content["count"]."<br>";
        }
      }
      echo "<br>";
    }
  } echo "<br>";
}
?>

Danke!!
 
Du speicherst es auch in das temporäre Array, welches du in deiner Schleife erstellst und nicht in dein eigentliches Array (foreach erstellt eine Kopie, keine Referenz)

Man kann hier auch eine Referenz mit &$array erstellen.

Der selbe Fehler ist auch oben passiert, aber erst nachdem du das 'count' eingebaut hattest, davor sollte eig noch das richtige Array genutzt worden sein.

Also direkt:
PHP:
$wantedGamePref[/* [Die ganzen Unterarrays] */] += 1;

Anstatt der Arrays aus der Foreach-Schleife.


Bei deinem aktuellen, binich mir nicht so sicher was du machst, deine Variablenbennenung macht es mir wirklich schwierig dem zu folgen.
 

Neue Beiträge

Zurück