Array 'säubern'

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

  • Array 'säubern'

    Hallo zusammen,


    Heute habe ich ein doch sehr kleines - aber feines - Problemchen.
    Ich hab, nachdem es durch eine foreach gelaufen ist, folgendes Array.

    Code:
    Array
    (
        [name] => Array
            (
                [x 1] => 2
                [x 2] => 1
                [x 3] => 0
                [x 4] => 0
                [x 5] => 0
                [x 6] => 0
                [x 7] => 2
                [] => 1
            ) 
    )
    Aus diesem möchte ich nun jeweils sowohl alles was als Wert "0" hat als auch Elemente die keinen Namen (also [] ) haben entfernen/löschen. Da die Namen (in diesem Fall x 1 bis x7) variabel sind kann ich mich nicht auf solche im Code festlegen muss also allein anhand der nicht vorhandenen Werte löschen.
    Wie stellt man sowas am besten an?


    Gruss

  • #2
    Hallo,

    wenn es ohnehin schon durch foreach läuft, kannst du dort ja gleich die Prüfung machen und die Elemente mit unset löschen. Dazu nimmst du die foreach-Notation mit Schlüssel:

    PHP-Code:
    foreach ($array as $key => $value) {
        if (...) {
            unset(
    $array[$key]);
        }

    Gruß,

    Amica
    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
    Super, danke!
    [/COLOR]

    Kommentar


    • #3
      Zitat von medium22 Beitrag anzeigen
      Aus diesem möchte ich nun jeweils sowohl alles was als Wert "0" hat als auch Elemente die keinen Namen (also [] ) haben entfernen/löschen.
      Bei letzterem kannst du nur Singular meinen.
      Ein solches kannst du mittels unset entfernen.

      Die 0-Werte kannst du bspw. mittels array_filter herauskicken.
      I don't believe in rebirth. Actually, I never did in my whole lives.

      Kommentar


      • #4
        PHP-Code:
        class CombiesArrayFilter extends FilterIterator
        {
          public function 
        accept()
          {
              if(
        ' ' == $this->key())     return false;
              if(
        0   == $this->current()) return false;
              return 
        true;
          }
        }
        $var['name'] = iterator_to_array(new CombiesArrayFilter(new ArrayIterator($var['name']))); 
        Wir werden alle sterben

        Kommentar


        • #5
          Hallo,


          Ich kann die filterung/löschung nicht direkt im o.g. foreach durchführen. Denn dort werden die Inhalte hochgezählt. Man muss sich die Werte/Zahlen als Counter vorstellen. Nach dem Durchlaufen der Schleife sollen nun alle Elemente die 0 enthalten oder gar keinen Schlüssel haben weg damit das weitere vorgehen richtig ausgeführt werden kann - davon hängt die weitere Ausführung ab.

          Ich scheitere aber irgendwie daran, dieses mehrdimensionale Array so zu durchlaufen, dass die genannten Werte gelöscht werden. Combie's Lösung schaut zumindest interessant aus - wirft aber einen Error aus mit dem ich als non-OOP-Mensch nicht anfangen kann. ;D
          Vielleicht ist meiner einer auch von den letzten drei Tagen Sicherheits-Seminar (nein.., nichts was mit Webentwicklung zu tun hat..) geschlaucht und ich seh den Wald vor lauter Bäumen nicht.

          Kommentar


          • #6
            Zitat von medium22 Beitrag anzeigen
            Ich kann die filterung/löschung nicht direkt im o.g. foreach durchführen. Denn dort werden die Inhalte hochgezählt. Man muss sich die Werte/Zahlen als Counter vorstellen.
            Da kann ich dir grad nicht ganz folgen. Warum kannst du das nicht mit unset direkt im foreach machen?
            [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
            Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
            Super, danke!
            [/COLOR]

            Kommentar


            • #7
              gar keinen Schlüssel haben
              Es gibt keine Array Elemente mit leeren Schlüssel.

              wirft aber einen Error aus mit dem ich als non-OOP-Mensch nicht anfangen kann
              Vermutlich machst du was falsch...
              Denn mein Code funktioniert mit deinem geposteten Fragment perfekt. !!

              Beweis:
              PHP-Code:
              <?php
              error_reporting
              (-1);
              ini_set('display_errors'TRUE);
               

              $var = Array
              (
                  
              'name' => Array
                      (
                          
              'x 1' => 2,
                          
              'x 2' => 1,
                          
              'x 3' => 0,
                          
              'x 4' => 0,
                          
              'x 5' => 0,
                          
              'x 6' => 0,
                          
              'x 7' => 2,
                          
              ' '   => 1,
                      ) ,
              );


              class 
              CombiesArrayFilter extends FilterIterator
              {
                public function 
              accept()
                {
                    if(
              '' == trim($this->key())) return false// leere Keys ??? nee...
                    
              if(0  == $this->current())   return false;
                    return 
              true;
                }
              }
              $var['name'] = iterator_to_array(new CombiesArrayFilter(new ArrayIterator($var['name'])));
              echo 
              '<pre>',var_export($var,true),'</pre>';
              Ausgabe:
              Code:
              array (
                'name' => 
                array (
                  'x 1' => 2,
                  'x 2' => 1,
                  'x 7' => 2,
                ),
              )
              Aber da das Ganze drumrum geheim ist...
              Zuletzt geändert von combie; 09.12.2009, 20:54.
              Wir werden alle sterben

              Kommentar


              • #8
                Zitat von combie Beitrag anzeigen
                Es gibt keine Array Elemente mit leeren Schlüssel.
                Wie kommst du darauf? Die gibt es doch.
                [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                Super, danke!
                [/COLOR]

                Kommentar


                • #9
                  Kommt darauf an wie man "leer" definiert.
                  PHP-Code:
                  $a = array(
                      
                  '' => 1,
                      
                  ' ' => 2,
                      
                  => 3,
                      
                  '0' => 4,
                      
                  NULL => 5,
                  );

                  // Ausgabe: array(3) {   [""]=>   int(5)   [" "]=>   int(2)   [0]=>   int(4) }
                  var_dump($a); 

                  Kommentar


                  • #10
                    Guten Morgen,


                    Als leer definiere ich in diesem Fall = ohne Inhalt.

                    @combie Unsere beiden Arrays unterscheiden sich aber

                    Deins
                    Code:
                    $var = Array
                    (
                        'name' => Array
                            (
                                'x 1' => 2[B],[/B]
                                'x 2' => 1[B],[/B]
                                'x 3' => 0[B],[/B]
                                'x 4' => 0[B],[/B]
                                'x 5' => 0[B],[/B]
                                'x 6' => 0[B],[/B]
                                'x 7' => 2[B],[/B]
                                ' '   => 1[B],[/B]
                            ) ,
                    );
                    Meins
                    Code:
                    $arr_count = Array
                    (
                        [name] => Array
                            (
                                [x 1] => 2
                                [x 2] => 1
                                [x 3] => 0
                                [x 4] => 0
                                [x 5] => 0
                                [x 6] => 0
                                [x 7] => 2
                                [] => 1
                            ) 
                    )
                    .. in meinem fehlt jeweils das Komma. Fällt mir aber auch erst jetzt auf. Demzufolge müsste das ja eigentlich nur ein einziges Element sein weil die Teilung/ der Begrenzer / das Komma fehlt. *denk*

                    Das ganz drum rum ist übrigens kein Geheimnis..
                    Als erstes werden einmalig Datensätze aus einer DB geholt und diesen jeweils der Wert 0 gesetzt

                    PHP-Code:
                    $arr_macro_list = array();
                    $arr_count = array();
                    $c 0;
                    $sql "SELECT * FROM x";
                    $result mysql_query($sql) or die(mysql_error());
                    while (
                    $row mysql_fetch_array($result)) {
                        
                    $macroname $row['macroname'];
                        
                    $str_sub substr($macroname1);
                        
                    $arr_macro_list[$c]['name'] = $str_sub;
                        
                    $arr_macro_list[$c]['id'] = $row['id'];
                        
                    $arr_count[name][$arr_macro_list[$c]['name']] = 0;
                        
                    $c ++;

                    Im Anschluss kommen die Formulardaten dazu. Diese werden nur durch explode gejagd, da es viele einzelne Texte sind, die genau gleich aufgebaut sind - nur der Textbeginn weist da jeweils einen Unterschied auf. Und genau die Anzahl dieser wird in genannter foreach-Schleife gezählt.
                    Nach diesem durchlauf gibt print_r mir dann folgendes Array aus

                    Code:
                    Array
                    (
                        [name] => Array
                            (
                                [x 1] => 2
                                [x 2] => 1
                                [x 3] => 0
                                [x 4] => 0
                                [x 5] => 0
                                [x 6] => 0
                                [x 7] => 2
                                [] => 1
                            ) 
                    )
                    Soweit so gut.. Weil aber in diesem Fall nur ein Textbaustein (bzw. Beginn) erlaubt ist, soll der Benutzer selbst entscheiden können welchen von den möglicherweise mehreren er nun weiter bearbeiten möchte. Und genau darum sollen alle 0er raus.
                    Ziel ist es dann, dass der Benutzer zb. "Du hast mehrere Bausteine verwendete, wähle einen aus: radio-x 1, radio-x 2, ..." als ausgabe bekommt und so weiter arbeiten kann.

                    Ich hoffe das war genug drum-rum-Info. :-)

                    Kommentar


                    • #11
                      Zitat von medium22 Beitrag anzeigen
                      @combie Unsere beiden Arrays unterscheiden sich aber
                      Eigentlich nicht, das sind nur unterschiedliche Repräsentationen (var_export vs. print_r). Gut, einen Unterschied gibt es: der eine Schlüssel ist bei dir der leere String und bei ihm ein Leerzeichen.
                      [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                      Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                      Super, danke!
                      [/COLOR]

                      Kommentar


                      • #12
                        Wozu erst mit SELECT * FROM X alle Macros aus der DB holen, wenn dann doch viele gar nicht gebraucht werden?

                        Kommentar


                        • #13
                          Zitat von onemorenerd Beitrag anzeigen
                          Wozu erst mit SELECT * FROM X alle Macros aus der DB holen, wenn dann doch viele gar nicht gebraucht werden?
                          Weil das an der Stelle noch nicht entscheidbar ist.

                          Zitat von medium22 Beitrag anzeigen
                          Als erstes werden einmalig Datensätze aus einer DB geholt und diesen jeweils der Wert 0 gesetzt
                          [...]
                          Im Anschluss kommen die Formulardaten dazu.
                          [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                          Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                          Super, danke!
                          [/COLOR]

                          Kommentar


                          • #14
                            Formulardaten stehen doch schon zu Beginn des Scripts in $_POST oder $_GET zur Verfügung.

                            Kommentar


                            • #15
                              Hm.., eigentlich auch eine Möglichkeit ans selbe Ziel zu kommen. Also zuerst die Formulardaten auswerten und direkt dort innerhalb von foreach (wenn noch nicht durch vorherigen durchlauf vorhanden..) ein Array mit jenen Teilen bilden die auch wirklich vorhanden sind. So gäbe es dann zumindest keine 0er/leere Elemente. Dadurch könnte man sich auch den Query sparen.

                              Das muss ich später gleich mal austesten! In jedem Fall (ob es so funktioniert oder nicht) werde ich mich nochmal melden - entweder mit Lösung oder Problem.

                              Danke für den versteckten Hinweis. ;D

                              Kommentar

                              Lädt...
                              X