Ankündigung

Einklappen
Keine Ankündigung bisher.

Aus mehrdimensionalem Array ein Baumdiagramm erstellen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Aus mehrdimensionalem Array ein Baumdiagramm erstellen

    Nabend Leute,


    Edit: Nach dem posten ist mir aufgefallen dass hier auch alles gequetscht wird, ich hoffe ihr könnt euch vorstellen dass das nicht alles linksbündig sein soll sondern entsprechend eingerückt.


    Ich bin gerade auf die Idee gekommen mir eine Klasse zu schreiben, die ein Array entgegennimmt und daraus ein Baumdiagramm macht.

    Mit Baumdiagramm meine ich sowas wie das was print_r erzeugt jedoch wesentlich lesbarer und eben auch für multidimensionale Arrays.

    Ein Output könnte so aussehen:

    Array
    (
    [0] => 'hallo'
    [1] => 'nochmal hallo'
    [2] => Array
    (
    [0] => 'wert 1'
    [1] => 'wert 2'
    [2] => Array
    (
    [0] => 'wert1'
    [1] => 'wert2'
    [2] => 'usw.'
    )
    )
    )

    Frage: Wie anstelln das ganze? Ich habe eben schon ne Weile dran rumgecoded aber bin an den Tabs gescheitert. Sprich alles total gequetscht und nen paar ( und ) sind auch durcheinander.

    Hat jemand ne Idee ?

    Gruß, greg


  • #2
    lösung:
    * rekursiv arbeiten,
    * die rekursionstiefe als parameter mitgeben.

    Kommentar


    • #3
      Dummerweise weis ich nicht was rekursiv bedeutet. Sagst dus mir oder muss ichs selbst suchen?

      €dit: So, habe natürlich selbst mal eben nachgeschaut. Also wenn rekursiv programmieren bedeutet, dass eine Funktion sich selbst aufruft bis eine bestimmte Bedingung zutrifft, dann mache ich das ohnehin schon.

      Also meine Funktion sah schon so aus:

      function parseArray($array)
      {
      if (is_array($array)) {
      $this->elements = count($array);
      foreach ($array as $key => $value) {
      $this->output .= '['.$key.']'.' => '.$value.'
      ';
      $this->parseArray($value);
      }
      } else {

      }
      }

      Aber das Problem war weniger das darstellen der Arrays ansich, sondern die Einrückung hierbei. Also wie weit nun der 10. Array nach rechts geschoben werden muss verstehst du?

      Kannst du mir vll. ein Beispiel geben wie ich das lösen kann?

      Kommentar


      • #4
        naja, das passt ja schon.

        übrigens: es gibt [ php ] - tags, womit du dein zeug ordentlich eingerückt und syntaxkoloriert anzeigen kannst.

        PHP-Code:
        <?php
        function parseArray($arr,$level 0) {
          [ .... ]
           
        $this -> parseArray($value,$level 1);
          [ .... ]
        }

        ?>
        und wie du jetzt einrücken kannst - lass dir was einfallen.

        http://www.php.net/str_repeat

        Kommentar


        • #5
          Mhh okay ich denke ich zähle einfach wie oft die funktion aufgrufen wurde und rücke dementsprechend ein.

          Kommentar


          • #6
            Zitat von greg
            Mhh okay ich denke ich zähle einfach wie oft die funktion aufgrufen wurde und rücke dementsprechend ein.
            nö, das geht so nicht. so würdest du z.b. ein array mit

            PHP-Code:
            <?php
            $arr 
            = array(
              
            'a' => array(
                 
            'a_a',
                 
            'a_b'.
              ),
              
            'b' => 'b_a',
            );
            ?>
            so einrücken:

            Code:
            a 
              a_a
                 a_b
                   b
                     b_a
            ... du willst aber folgendes:
            Code:
            a
              a_a
              a_b
            b
              b_a
            ... ergo musst du rekursions-tiefen einrücken und nicht funktionsaufrufe und das funktioniert entweder so, wie ich's dir bereits geschrieben habe, oder mit einer zusätzlichen klassenvariable, die du vor dem erneuten aufruf der funktion inkrementierst und nach dem aufruf wieder runterzählst. das ist aber noch blöder zu verstehen.

            Kommentar


            • #7
              nö, das geht so nicht. so würdest du z.b. ein array mit
              Danke dass du aufgepasst hast. Es gibt tatsächlich Leute die nachdenken bevor sie etwas fressen ...

              Ist mir beim schreiben schon klargeworden dass das so nicht hinhaut. Denn Funktionsaufrufe kann es ja jede menge mehr geben als Array - Tiefen. Jedoch wenn ich bei jedem Funktionsdurchlauf prüfe ob es sich um einen Array handelt und dementsprechend nur dann die Zahl hochsetze, dann müsste das doch passen.
              Bin mir da aber noch nicht richtig sicher, das muss ich nachher mal testen.

              Ich denke das ist so eine Mischung aus deinem ersten Vorschlag und deinem zweiten Vorschlag.

              Nichs für ungut, ich probiers einfach mal aus.

              Danke dir für deine Hilfe.

              Kommentar


              • #8
                ich hab da mal vor einiger zeit was geschrieben *rauskram*:
                PHP-Code:
                <?php
                function treemenu($array$level 0) {
                    foreach(
                $array AS $key => $val) {
                        
                $tabs '';
                        for(
                $i=0;$i<=$level;$i++) {
                            
                $tabs .= "\t";
                        }
                        
                $type gettype($val);
                        switch(
                $type) {
                            case 
                "string":
                                 
                $type .= '('.strlen($val).')';
                                 break;
                            case 
                "array":
                                 
                $type .= '('.count($val).')';
                                 break;
                            case 
                "integer":
                            case 
                "float":
                            case 
                "double":
                            case 
                "resource":
                                 
                $type "(".$type.")";
                                 break;
                        }
                        
                printf("%s[%s] %s => %s\n"$tabs$key$type$val);
                        if(
                is_array($val)) {
                            
                treemenu($array[$key], $level+1);
                        }
                    }
                }
                ?>
                das macht eigentlich das was du willst!
                aber warum ist print_r () unleserlich??

                eagleScripts.de

                Kommentar


                • #9
                  Ach ich hatte das Manual zu print_r und var_dump nur halb gelesen. Sowas kommt dann dabei raus. Folgender Code:

                  PHP-Code:
                  <?php
                      $arr 
                  token_get_all("<? [url]www.phpfriend.de[/url] ?>");
                      
                  $output print_r($arrtrue);
                      echo 
                  "<pre>";
                      echo 
                  $output;
                      echo 
                  "</pre>";
                  ?>
                  stellt alles wunderbar dar. Der Umbruch erfolgt bei print_r lediglich mit \n und nicht mit
                  -> daher müsste man die Seite im Plain ausgeben.

                  Folgende Funktion löst das Problem auch wunderbar (php.net/var_dump)

                  PHP-Code:
                  <?php
                      
                  function show($data$func "print_r"$return_str false){
                         
                  ob_start();
                         
                  $func($data);
                         
                  $output '<pre>'.htmlspecialchars(ob_get_contents()).'</pre>';
                         
                  ob_end_clean();
                         if(
                  $return_str) return $output; else echo $output;
                      }
                  ?>
                  Wusste ich gestern halt noch nicht

                  Kommentar


                  • #10
                    kannst auch einfach in den quelltet guckn!

                    eagleScripts.de

                    Kommentar


                    • #11
                      Jo aber das bringt mir nicht sonderlich viel wenn ich beispielsweise in einem Tutorial auf meiner Website, den Inhalt eines Arrays kurz wiedergeben will.

                      Dafür war das eigentlich gedacht.

                      Kommentar


                      • #12
                        Der Beitrag wurde verschoben, wegen...
                        ... Postings im falschen Forum. Bitte beim nächsten Mal darauf achten..

                        Bemerkung:
                        Die gestellte Frage entspricht nicht dem Wissensstand eines Profis. Dazu: http://www.phpfriend.de/forum/viewtopic.php?t=21431

                        moved to PHP - Fortgeschrittene
                        mod = master of disaster

                        Kommentar

                        Lädt...
                        X