Nina: Array verschönern

Hi,

leider hab ich einen etwas unschönen Array in meinem Script, den ich gerne etwas hübscher hätte. So ist er gerade:
Array
(
    [MYAPI] => Array
        (
            [0] => Array
                (
                    [DATA] => Array
                        (
                            [0] => Array
                                (
                                    [D0] => Array
                                        (
                                            [0] => Array
                                                (
                                                    [TITLE] => Array
                                                        (
                                                            [0] => Array
                                                                (
                                                                    [data] => foo bla
                                                                )

)

[DESCRIPTION] => Array
                                                        (
                                                            [0] => Array
                                                                (
                                                                    [data] => bar bla
                                                                )

)

)

)

[D1] => Array
                                        (
                                            [0] => Array
                                                (
                                                    [TITLE] => Array
                                                        (
                                                            [0] => Array
                                                                (
                                                                    [data] => foo1
                                                                )

)

[DESCRIPTION] => Array
                                                        (
                                                            [0] => Array
                                                                (
                                                                    [data] => bar1 blub
                                                                )

)

)

)

)

)

[QID] => Array
                        (
                            [0] => Array
                                (
                                    [data] => xyz
                                )

)

)

)

)

Und eigentlich ist es doch immer das selbe: [0]['data'] könnte man sich doch eigentlich sparen. Könnt ihr mir bitte verraten, wie sich das vereinfachen lässt damit die überflüssigen Untergliederungen wegfallen?

Danke für diesen Fall schonmal

  1. Moin!

    leider hab ich einen etwas unschönen Array in meinem Script, den ich gerne etwas hübscher hätte.

    Das Array entsteht wohl durch entsprechende Klassen, die diese Struktur fest vorgeben. Es hat durchaus Ähnlichkeit mit einer XML-Struktur.

    Und eigentlich ist es doch immer das selbe: [0]['data'] könnte man sich doch eigentlich sparen.

    Was deine derzeitigen konkreten Daten angeht, sicherlich. Aber wenn das z.B. eine XML-Struktur ist, dann hat dieses Array durchaus seinen Sinn, weil eben auch [1]['data'] auftreten könnte, oder [0]['attribute'] oder so ähnlich. Die von dir als überflüssig empfundenen Ebenen sind also technisch nicht überflüssig.

    Wenn du daran etwas ändern willst, müßtest du entweder an der Erzeugung dieses Arrays etwas verändern, oder es nochmal umkopieren und dabei alles, was dir nicht gefällt, weglassen - mit der Gefahr, dass die Datenquelle sich irgendwann mal ungünstig ändert und die Ebenen, die jetzt überflüssig scheinen, wichtig werden - das kann ich aber nicht abschätzen.

    - Sven Rautenberg

    --
    "Love your nation - respect the others."
    1. Moin,

      in der Tat handelt es sich um eine Rückgabe von XML-Daten.
      Doch diese kommen von einer API, die immer die selbe Struktur hat und bei der es in jedem Fall überflüssig ist, dass der Array das wie besprochen Unterteilt:
      <?
      class XMLParser
      {
          var $parser;
          var $filePath;
          var $document;
          var $currTag;
          var $tagStack;

      function XMLParser($path)
          {
          $this->parser = xml_parser_create();
          $this->filePath = $path;
          $this->document = array();
          $this->currTag =& $this->document;
          $this->tagStack = array();
          }

      function parse()
          {
          xml_set_object($this->parser, $this);
          xml_set_character_data_handler($this->parser, 'dataHandler');
          xml_set_element_handler($this->parser, 'startHandler', 'endHandler');

      if(!($fp = fopen($this->filePath, "r")))
          {
              die("Cannot open XML data file: $this->filePath");
              return false;
          }

      while($data = fread($fp, 4096))
          {
              if(!xml_parse($this->parser, $data, feof($fp)))
              {
              die(sprintf("XML error: %s at line %d",
                      xml_error_string(xml_get_error_code($this->parser)),
                      xml_get_current_line_number($this->parser)));
              }
          }

      fclose($fp);
          xml_parser_free($this->parser);

      return true;
          }

      function startHandler($parser, $name, $attribs)
           {
          if(!isset($this->currTag[$name]))
               $this->currTag[$name] = array();

      $newTag = array();
          if(!empty($attribs))
               $newTag['attr'] = $attribs;
          array_push($this->currTag[$name], $newTag);

      $t =& $this->currTag[$name];
          $this->currTag =& $t[count($t)-1];
          array_push($this->tagStack, $name);
           }

      function dataHandler($parser, $data)
           {
          $data = trim($data);

      if(!empty($data))
          {
               if(isset($this->currTag['data']))
              $this->currTag['data'] .= $data;
               else
              $this->currTag['data'] = $data;
          }
           }

      function endHandler($parser, $name)
           {
          $this->currTag =& $this->document;
          array_pop($this->tagStack);

      for($i = 0; $i < count($this->tagStack); $i++)
          {
               $t =& $this->currTag[$this->tagStack[$i]];
               $this->currTag =& $t[count($t)-1];
          }
           }
      }
      ?>

      So sieht es z.B. aus:
      <myapi>
          <data>
              <d0>
                  <title>foo bla</title>
                  <description>bar bla</description>
              </d0>
              <d1>
                  <title>foo1</title>
                  <description>bar1 blub</description>
              </d1>
          </data>
          <qid>xyz</qid>
      </myapi>

      Egal, was ich an der Klasse ändere: sie funktioniert anschließend nicht mehr bzw. überschreibt sämtliche Daten. Bekomme es leider auch nach langem Probieren nicht hin :(

      Bitte um Hilfe

      1. Moin!

        Egal, was ich an der Klasse ändere: sie funktioniert anschließend nicht mehr bzw. überschreibt sämtliche Daten. Bekomme es leider auch nach langem Probieren nicht hin :(

        Dann muß dein Wunsch nach innerer Schönheit des Arrays, die sowieso niemand sieht, wohl hinter deinen noch nicht ganz perfektionierten Programmierkenntnissen zurückstehen. Wenn du das Array änderst, müssen sich ja auch diverse Stellen ändern, die das Array weiterverwenden. Wozu dann umbauen?

        Ansonsten: Du hast eine ziemlich normale XML-Parserklasse, die mit den ganz billigen normalen XML-Parserfunktionen arbeitet, die eventbasiert ein XML parsen können. Lies mal die Doku dazu durch und schreib dir dann einen Parser, der genau das ins Array packt, was du benötigst.

        - Sven Rautenberg

        --
        "Love your nation - respect the others."