Mehrdimensionales Array – Wenn gleiche Keys keine wert haben, nur dann diese löschen

daveG

Grünschnabel
Hi, ich benötige mal eure Hilfe.

Ich habe ein Mehrdimensionales Array:

PHP:
Array
(
    [0] => Array
        (
            [aaa] => 
            [bbb] => a
            [ccc] => a
            [ddd] => a
            [fff] => 
        )

    [1] => Array
        (
            [aaa] => a
            [bbb] => a
            [ccc] => 
            [ddd] => a
            [fff] => 
        )

    [2] => Array
        (
            [aaa] => a
            [bbb] => a
            [ccc] => 
            [ddd] => a
            [fff] => 
        )

    [3] => Array
        (
            [aaa] => a
            [bbb] => a
            [ccc] => a
            [ddd] => a
            [fff] => 
        )

)


Nun möchte ich, ich haben keinen Plan wie, dass am Ende dieses Array rauskommt:


PHP:
Array
(
    [0] => Array
        (
            [aaa] => 
            [bbb] => a
            [ccc] => a
            [ddd] => a
        )

    [1] => Array
        (
            [aaa] => a
            [bbb] => a
            [ccc] => 
            [ddd] => a
        )

    [2] => Array
        (
            [aaa] => a
            [bbb] => a
            [ccc] => 
            [ddd] => a
        )

    [3] => Array
        (
            [aaa] => a
            [bbb] => a
            [ccc] => a
            [ddd] => a
        )

)

In der zweiten Ebene wurde Key-"fff" gelöscht, da dieser überall keinen Wert hatte.

Kann mir jemand Helfe?
 
Danke für deine schnelle Antwort,

fff ist immer auf der zweiten Ebene, also das Array sieht immer so aus, es geht nicht tiefer.

fff existiert immer.
 
Zuletzt bearbeitet:
Moin,
fff existiert immer
um mal ein paar Haare zu spalten: nach dem Löschen wohl nicht mehr, oder ?? :-]

Mal ins Unreine gesprochen:
Code:
in einer Schleife über den ersten Index laufen:

wenn
  Array[0][aaa] ist leer
&& Array[1][aaa] ist leer
&& Array[2][aaa] ist leer ...
dann den Index [aaa] zum löschen vormerken

wenn
  Array[0][bbb] ist leer
&& Array[1][bbb] ist leer
&& Array[2][bbb] ist leer ...
dann den Index [bbb] zum löschen vormerken

Abschließend die gemerkten Indices löschen

Gruß Klaus
 
Gut, also wenn ich mich darauf verlassen kann, dass alle Unterarraykeys in allen Unterarrays vorkommen, ca. sowas:
PHP:
//Volles Array in $arr

//Nur wegen der nächsten Zeite nötig, die auf $arr[0]
//zugreift (eben, ob es das überhaupt gibt).
if(count($arr) > 0)
{

    //Die Keys vom ersten Unterarray selber als Array nehmen.
    //Also aus
    //  [aaa]=>x, [bbb]=>y, [ccc]=>z
    //wird
    //  0=>aaa, 1=>bbb, 2=>ccc
    //In diesem $keys enthalten sind zumindest alle später zu
    //löschenden keys (aber auch noch andere). Laut Angabe
    //sind die zu löschenden Keys ja in jedem Subarray, also
    //auch im Ersten.
    $keys = array_keys($arr[0]);

    //Jetzt jedes Subarray durchgehen...
    foreach($arr as &$subarray)
    {
         //...pro Subarray alle Keys in $keys
         //(zumindest die, die man "noch" hat)...
         foreach($keys as $k => $v)
         {
              //...und den aktuellen Key aus keys löschen,
              //wenn er im aktuellen Subarray einen nicht
              //leeren Wert hat.
              if(!empty($subarray[$v]))
                  unset($keys[$k]);
         }
     }
     //Was jetzt in $keys noch übrig ist hatte nur leere
     //Werte, sonst wäre es schon rausgelöscht worden.

     //Jetzt für den übrig gebliebenen Key alle Subarrays
     //durchgehen und den Key jeweils rauslöschen.
     foreach($keys as $v)
     {
           foreach($arr as &$subarray)
               unset($subarray[$v]);
     }
}
 
Zuletzt bearbeitet:
Gut, also wenn ich mich darauf verlassen kann, dass alle Unterarraykeys in allen Unterarrays vorkommen, ca. sowas:
PHP:
//Volles Array in $arr
if(count($arr) > 0)
{
    $keys = array_keys($arr[0]);
    foreach($arr as &$subarray)
    {
         foreach($keys as $k => $v)
         {
              if(!empty($subarray[$v]))
                  unset($keys[$k]);
         }
     }
     foreach($keys as $v)
     {
           foreach($arr as &$subarray)
               unset($subarray[$v]);
     }
}

@sheel -> Danke, genau so habe ich mir das vorgestellt und ich merke, dass ich selbst knapp dran war. Kannst du mir noch einen gefallen machen, und für die, die vielleicht auch auf das Thema stoßen -> mal jede Zeile kommentieren - Danke.
 
Danke, echt klasse! "Thema gelöst"

PHP:
//Volles Array in $arr

//Nur wegen der nächsten Zeite nötig, die auf $arr[0]
//zugreift (eben, ob es das überhaupt gibt).
if(count($arr) > 0)
{

    //Die Keys vom ersten Unterarray selber als Array nehmen.
    //Also aus
    //  [aaa]=>x, [bbb]=>y, [ccc]=>z
    //wird
    //  0=>aaa, 1=>bbb, 2=>ccc
    //In diesem $keys enthalten sind zumindest alle später zu
    //löschenden keys (aber auch noch andere). Laut Angabe
    //sind die zu löschenden Keys ja in jedem SUbarray, also
    //auch im Ersten.
    $keys = array_keys($arr[0]);

    //Jetzt jedes Subarray durchgehen...
    foreach($arr as &$subarray)
    {
         //...pro Subarray alle Keys in $keys
         //(zumindest die, die man "noch" hat)...
         foreach($keys as $k => $v)
         {
              //...und den aktuellen Key aus keys löschen,
              //wenn er im aktuellen Subarray einen nicht
              //leeren Wert hat.
              if(!empty($subarray[$v]))
                  unset($keys[$k]);
         }
     }
     //Was jetzt in $keys noch übrig ist hatte nur leere
     //Werte, sonst wäre es schon rausgelöscht worden.

     //Jetzt für den übrig gebliebenen Key alle Subarrays
     //durchgehen und den Key jeweils rauslöschen.
     foreach($keys as $v)
     {
           foreach($arr as &$subarray)
               unset($subarray[$v]);
     }
}
 

Neue Beiträge

Zurück