Announcement

Collapse
No announcement yet.

Arrayproblem

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Arrayproblem

    Servus.
    Ich habe folgendes Problem:

    Code:
    <?php
    
    function debug($param)
    {
        // Output    
    }
    
    function anyFunction($param = null)
    {
        $anyArray = array();
        
        $anyArray['item1']['value1'] = 'iv11';
        $anyArray['item1']['value2'] = 'iv12';
        $anyArray['item2']['value1'] = 'iv21';
        $anyArray['item2']['value2'] = 'iv22';
        $anyArray['item3']['value1'] = 'iv31';
        $anyArray['item3']['value2'] = 'iv32';
        
        return $anyArray;
    }
    
    $data = anyFunction();
    debug($data);
    Dieser Code gibt das Array aus der Funktion anyFunction aus (mittels einer debug-Funktion).
    Wie schaffe ich es mittels Parameter einen Wert ausgeben zulassen nach folgendem Prinzip:

    Achtung, Pseudocode!
    Code:
    <?php
    
    function debug($param)
    {
        // Output    
    }
    
    function anyFunction($param = null)
    {
        $anyArray = array();
        
        $anyArray['item1']['value1'] = 'iv11';
        $anyArray['item1']['value2'] = 'iv12';
        $anyArray['item2']['value1'] = 'iv21';
        $anyArray['item2']['value2'] = 'iv22';
        $anyArray['item3']['value1'] = 'iv31';
        $anyArray['item3']['value2'] = 'iv32';
        
        if ($param && isset($anyArray['item1']['value2'])) {
            return $anyArray['item1']['value2'];
        }
        else {
            return false;
        }
    }
    
    $data = anyFunction(['item1']['value2']);
    debug($data);
    Ich möchte erreichen, dass ich durch einen Parameter definieren kann, welcher Wert aus dem Array zurückgegeben werden soll. Ich stelle mich sicher ein wenig dumm an, aber ich bin nicht auf eine Lösung gekommen. Das kann doch nicht so schwer sein...
    Ants aren't dead

  • #2
    Wenn der Parameter irgendein Wert darstellt, der in dem Array gespeichert ist (also im obigen Beispiel iv1x), musst du das Array durchlaufen und suchen wo der Parameter ist. Dieses Arrayelement wird dann zurückgegeben

    http://php.net/manual/de/function.array-search.php
    Christian

    Comment


    • #3
      Hallo,

      wenn du Werte aus einem zweidimensionalen Array erhalten möchtest, dann wirst du wohl ZWEI Parameter übergeben müssen:
      PHP Code:
      function anyFunction($param1 null$param2 null)
      {
          
      $anyArray = array();
          
          
      $anyArray['item1']['value1'] = 'iv11';
          ...
          
          if (
      $param1 && $param2 && isset($anyArray[$param1][$param2])) {
              return 
      $anyArray[$param1][$param2];
          }
          else {
              return 
      false;
          }
      }

      $data anyFunction('item1''value2'); 
      Gruß Falk
      Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

      Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

      Comment


      • #4
        Jo, soweit war ich auch, jedoch ist es nciht möglich zu wissen wie viele Dimensionen das Array haben wird. von daher habe ich überlegt, ob ich einen Parameter übergeben soll, als String, und mit Kommata getrennt. Dieser wird dann per explode gesplittet, aber dann muss ich noch schauen wie ich dann je item eine Ebene, bzw Dimension weiter runterkomme. Darüber habe ich mir wohl noch keine Gedanken gemacht...

        Beispiel:
        Code:
        <?php
        
        function anyFunction($param = null)
        {
            $anyArray = array();
        
            $anyArray['item1']['value1'] = 'iv11';
            // [...]
        
            if ($param) {
                $items = explode(',', $param);
                foreach ($items AS item) {
                    $ergebnis = // Je Durchlauf eine Ebene tiefer
                }
                return $ergebnis;
            }
            else {
                return false;
            }
        }
        
        $data = anyFunction('item1,value2');
        Zuletzt editiert von Antz; 09.01.2012, 13:56.
        Ants aren't dead

        Comment


        • #5
          Habs nochmal überlegt und bin zu folgendem Ergebnis gekommen:
          Code:
          <?php
          
          function anyFunction($param = null)
          {
              $anyArray = array();
          
              $anyArray['ebene1']['ebene2']['ebene3'] = 'value';
              // [...]
          
              if ($param) {
                  $items = explode(',',$param);
                  mamdebug($items,'items');
          
                  $max = count($items);
                  $ergebnis = $anyArray[$items[0]];
          
                  for ($i = 1; $i < $max; $i++) {
                      $ergebnis = $ergebnis[$items[$i]];
                      mamdebug($ergebnis,'ergebnis');
                  }
                  return $ergebnis;
              }
              else {
                  return false;
              }
          }
          
          
          debug(anyFunction('ebene1,ebene2,ebene3'));
          Dennoch bin ich mit dieser Methode nicht zu frieden, scheinbar gibt es aber keine andere Möglichkeit (für eine unbekannte Tiefe des Arrays).
          Ants aren't dead

          Comment


          • #6
            Da du das Array ja irgendwann, irgendwie anlegst liegt doch dort die Information vor, wie tief das Array ist.
            Zuletzt editiert von Christian Marquardt; 10.01.2012, 08:36.
            Christian

            Comment


            • #7
              Hallo,

              statt einen kommaseparierten String zu splitten, kann man sich auch den Umstand zu nutze machen, dass PHP eine Variable Anzahl an Parametern unterstützt. Auch ist es von Vorteil bei der Iteration über die Ebenen mit Referenzen zu arbeiten, statt immer das komplette Array in das Zwischenergebnis zu kopieren.

              PHP Code:
              function anyFunction()
              {
                
              $anyArray = array(
                  
              'ebene1' => array(
                    
              'ebene2' => array(
                      
              'ebene3' => 'anyValue',
                    ),
                  ),
                );

                
              $numArg =  func_num_args();
                
              $curVal =& $anyArray;

                for (
              $i 0$i $numArg$i++) {
                  
              $curParam func_get_arg($i);
                  if (isset(
              $curVal[$curParam])) {
                    
              $curVal =& $curVal[$curParam];
                  }
                  else {
                    return 
              null;
                    
              // oder besser eine Exception auslösen!
                  
              }
                }

                return 
              $curVal;
              }

              $data anyFunction('ebene1''ebene2''ebene3'); 
              Gruß Falk
              Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

              Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

              Comment


              • #8
                Ah ja klar, das ist natürlich bedeutend eleganter, ich vergesse immer dass das PHP auch kann, warum auch immer ich nicht daran denke.

                Danke schön.
                Ants aren't dead

                Comment

                Working...
                X