MartinStays: Arrays: Doppelte Einträge, Zugriff...

Hello,

mein Array ($a_all) sieht wie folgt aus:

Array
(
    [0] => Array
        (
            [info] => SimpleXMLElement Object
                (
                    [0] => Haus
                )

[mehrinfo] => Array
                (
                    [0] => SimpleXMLElement Object
                        (
                            [0] => Unsicher
                        )

[1] => SimpleXMLElement Object
                        (
                            [0] => Drückend
                        )

)

)

[1] => Array
        (
            [info] => SimpleXMLElement Object
                (
                    [0] => Boot
                )

[mehrinfo] => Array
                (
                    [0] => SimpleXMLElement Object
                        (
                            [0] => Blau
                        )

)

)

)

FRAGE 1:
[mehrinfo] enthält belieb viele Inhalte. Wie kann ich mit PHP auf den Inhalt von [mehrinfo] zugreifen? Mit $a_all['info']['mehrinfo'] klappt es nicht das es sich ja darin nochmals um ein Array handelt.

FRAGE 2:
Es kann sehr gut sein dass der Hauptarrayinhalt [info] öfters den selben Inhalt hat, wie lassen sich dort doppelte Inhalt löschen? Also der Block kann dann komplett rausfallen wenn es ihn im Array schon gibt.

Danke!

  1. echo $begrüßung;

    [mehrinfo] enthält belieb viele Inhalte. Wie kann ich mit PHP auf den Inhalt von [mehrinfo] zugreifen? Mit $a_all['info']['mehrinfo'] klappt es nicht das es sich ja darin nochmals um ein Array handelt.

    $a_all ist ein Array mit Elementen mit numerischen Keys. Darauf greifst du mit $a_all[0], $a_all[1] usw. zu. Diese Elemente sind Arrays mit den Keys info und mehrinfo, also $a_all[0]['info'] und $a_all[0]['mehrinfo']

    Es kann sehr gut sein dass der Hauptarrayinhalt [info] öfters den selben Inhalt hat, wie lassen sich dort doppelte Inhalt löschen? Also der Block kann dann komplett rausfallen wenn es ihn im Array schon gibt.

    Durchlaufe $a_all, frage die info-Elemente ab und merk dir, welche Werte du bereits hattest in einer temporären Datenhaltung (z.B. ein Array). Für jeden Wert schaust du, ob er bereits gemerkt ist (z.B: in_array()) und entscheidest, ob das gerade aktuelle Element zu löschen ist oder nicht.

    echo "$verabschiedung $name";

    1. Danke für deine Hilfe!

      $a_all ist ein Array mit Elementen mit numerischen Keys. Darauf greifst du mit $a_all[0], $a_all[1] usw. zu. Diese Elemente sind Arrays mit den Keys info und mehrinfo, also $a_all[0]['info'] und $a_all[0]['mehrinfo']

      Habe ich nun gelöst, danke!

        
      foreach ($a_all[$i]['mehrinfo'] as $mehrinfo) {  
       echo $mehrinfo.'<br/>';  
      }
      

      Durchlaufe $a_all, frage die info-Elemente ab und merk dir, welche Werte du bereits hattest in einer temporären Datenhaltung (z.B. ein Array). Für jeden Wert schaust du, ob er bereits gemerkt ist (z.B: in_array()) und entscheidest, ob das gerade aktuelle Element zu löschen ist oder nicht.

      Okay, jetzt wirds kompliziert, zumindest für mich ;-)
      In diesem Fall kann ich also nicht mit array_unique arbeiten wegen der Struktur meines Arrays, oder?

      1. echo $begrüßung;

        Durchlaufe $a_all, frage die info-Elemente ab und merk dir, welche Werte du bereits hattest in einer temporären Datenhaltung (z.B. ein Array). Für jeden Wert schaust du, ob er bereits gemerkt ist (z.B: in_array()) und entscheidest, ob das gerade aktuelle Element zu löschen ist oder nicht.
        Okay, jetzt wirds kompliziert, zumindest für mich ;-)
        In diesem Fall kann ich also nicht mit array_unique arbeiten wegen der Struktur meines Arrays, oder?

        Richtig, das geht nicht. array_unique() arbeitet mit einem Array, du hast ja mehrere Arrays vorliegen (die fein säuberlich in $a_all angeordnet sind, aber das ist für das array_unique() nicht weiter relevant). Dir wird nich viel anderes übrigbleiben, als durch dein $a_all durchzulaufen. array_filter(), foreach, array_walk() oder array_map() könnten dafür nützlich sein.

        echo "$verabschiedung $name";

        1. Richtig, das geht nicht. array_unique() arbeitet mit einem Array, du hast ja mehrere Arrays vorliegen (die fein säuberlich in $a_all angeordnet sind, aber das ist für das array_unique() nicht weiter relevant). Dir wird nich viel anderes übrigbleiben, als durch dein $a_all durchzulaufen. array_filter(), foreach, array_walk() oder array_map() könnten dafür nützlich sein.

          Da ich es so nicht hinbekommen haben wie du es mir erklärt hast, obwohl es sinnvoll klingt habe ich etwas anderes probiert.

          Ich kann doch bevor ein Eintrag in der Array gemacht wird, mit in_array überprüfen ob dieses Teil bzw. der Text schon im Array ist, wenn ja dann mache nichts, wenn nein dann füge hinzu.

          Müsste doch klappt, oder?

          BSP. verkleinert

            
          foreach ($Report->Problems->Page->RuleInfr as $listWarning) {  
          if(in_array($listWarning->Value, $a_all)) {  
           echo 'gibts schon';  
          }  
          else {  
           $a_all[$i]['info'] = $listWarning->Value;  
          }  
          }  
          
          

          Lädt trotzdem alle doppelten in meinen Array :(

          Jemand eine Idee?

          1. echo $begrüßung;

            Ich kann doch bevor ein Eintrag in der Array gemacht wird, mit in_array überprüfen ob dieses Teil bzw. der Text schon im Array ist, wenn ja dann mache nichts, wenn nein dann füge hinzu.

            in_array() prüft in einem "flachen" Array. Es steigt nicht in die einzelnen Elemente hinein, wenn diese komplexen Typs (Array, Objekt) sind. Dein $a_all ist eine Sammlung von verschachtelte Arrays (noch dazu gemischt mit Objekten). Das zu durchsuchen gibt es keine Standard-Funktionen. Und du willst ja auch nicht alles durchsuchen, sondern nur die info-Elemente.

            echo "$verabschiedung $name";