Nicki: Problem mit array_unique

Hallo liebe Gemeinde,

ich ordne auf meiner Website/Blog für jeden Artikel je zwei Tags zu, die allerdings gefiltert ausgegeben werden sollen (doppelte Tags weglassen). Dazu habe ich 2 Dateien.

In Datei 1 (article.php) steht folgendes:

  
$article1 = array();  
$article1['tag'] = 'Web';  
$article1['tag2'] = 'Design';  
  
$article2 = array();  
$article2 ['tag'] = 'Web';  
$article2 ['tag2'] = 'Programmierung';  
  
$article3 = array();  
$article3['tag'] = 'Seo';  
$article3['tag2'] = 'Design';  
  
  
###############  
  
  
$articles = array($art1, $art2, $art3);  

Datei 2 (footer.php) gibt die Tags dann aus und lässt die doppelten weg.

  
$file = 'tags.txt';  
$handler = fopen($file, "w");  
  
foreach($articles as $article) {  
  fwrite ($handler, $article['tag'].'|');  
  fwrite ($handler, $article['tag2'].'|');  
}  
  
$mytags = file_get_contents($file);  
$tags = explode('|', $mytags);  
foreach (array_unique($tags) as $tag) {  
  echo "<a href='index.php?tg=$tag'>$tag</a> "; // Dateiinhalt ausgeben  
}  

Das Klappt soweit super. Allerdings möchte ich nicht erst den Umweg über die txt-Datei gehen, sondern gern die Arrays direkt filtern. Etwa so..

  
foreach (array_unique($articles) as $article) {  
  echo "<a href='index.php?tg=$article[tag]'>$article[tag]</a>&nbsp;<a href='index.php?tg=$article[tag2]'>$article[tag2]</a>";  
}  

Leider klappt das nicht, wie könnte ich das besser machen?

Viele Grüße
Nicki

  1. hi Nicki,

    Leider klappt das nicht, wie könnte ich das besser machen?

    Was klappt nicht und warum klappt es nicht?

    mfg

    tami

    1. Was klappt nicht und warum klappt es nicht?

      Hallo tami,

      Wenn ich es so versuche, werden nur die ersten 2 Tags von $article1 ausgegeben, also in meinem Beispiel 'Web' und 'Design'. Die Tags von $article2 und $article3 werden ignoriert.

        
      foreach (array_unique($articles) as $article) {  
        echo "<a href='index.php?tg=$article[tag]'>$article[tag]</a>&nbsp;<a href='index.php?tg=$article[tag2]'>$article[tag2]</a>";  
      }  
      
      

      Viele Grüße
      Nicki

      1. hi Nicki,

        Was klappt nicht und warum klappt es nicht?

        Hallo tami,

        Wenn ich es so versuche, werden nur die ersten 2 Tags von $article1 ausgegeben, also in meinem Beispiel 'Web' und 'Design'. Die Tags von $article2 und $article3 werden ignoriert.

        foreach (array_unique($articles) as $article) {
          echo "<a href='index.php?tg=$article[tag]'>$article[tag]</a>&nbsp;<a href='index.php?tg=$article[tag2]'>$article[tag2]</a>";
        }

          
        Was sagt var\_dump($articles);?  
        Was sagt var\_dump(array\_unique($articles));?  
          
        Wo kommt das [tag2] her?  
          
        Du testest "falsch". Teste ohne das HTML-Zeugs, bis du die Variablen ausspucken kannst, die du brauchst. Dann bau den HTML-Krempel drumrum.  
          
        mfg  
          
        tami
        
        1. Was sagt var_dump($articles);?

            
          array(6) {  
          [0]=> array(17) {["tag"]=> string(13) "Web" ["tag2"]=> string(10) "Design"}  
          [1]=> array(17) {["tag"]=> string(13) "Web" ["tag2"]=> string(10) "Programmierung"}  
          [2]=> array(17) {["tag"]=> string(13) "Seo" ["tag2"]=> string(10) "Design"}  
          }  
          
          

          Hier klappt es, allerdings werden alle Tags ausgegeben, auch die doppelten!!!

          Was sagt var_dump(array_unique($articles));?

            
          array(1) {  
          [0]=> array(17) {["tag"]=> string(13) "Web" ["tag2"]=> string(10) "Design"}  
          }  
          
          

          Und hier werden nur die ersten zwei ausgegeben.

          Wo kommt das [tag2] her?

          Schau nochmal im Ausgangsposting. Ich habe jeweils zwei Tags für einen Artikel definiert. (Datei 1)

          Du testest "falsch". Teste ohne das HTML-Zeugs, bis du die Variablen ausspucken kannst, die du brauchst. Dann bau den HTML-Krempel drumrum.

          Bringt das gleiche Ergebnis.

          Viele Grüße
          Nicki

          1. hi Nicki,

            Du testest "falsch". Teste ohne das HTML-Zeugs, bis du die Variablen ausspucken kannst, die du brauchst. Dann bau den HTML-Krempel drumrum.

            Bringt das gleiche Ergebnis.

            Ich kapiere nicht, was du weglassen willst und was rauskommen soll.

            mfg

            tami

            1. Ich kapiere nicht, was du weglassen willst und was rauskommen soll.

              Wenn ich ganz normal die Arrays mittels foreach ($articles as $article) auslesen lasse, bekomme ich folgende Tags im Footermenü angezeigt:

              Web, Design, Web, Programmierung, Seo, Design

              *************************************

              Das ist schon soweit gut. Ich möchte aber die DOPPELTEN TAGS mit foreach (array_unique($articles) as $article) AUSSORTIEREN, sodass ich folgendes Ergebnis erhalte:

              Web, Design, Programmierung, Seo

              *************************************

              Das aussortieren klappt aber nicht, ich erhalte als Ergebnis nur die ersten zwei arrays:

              Web, Design

              *************************************

              Viele grüße
              Nicki

              1. Hallo,

                Das ist schon soweit gut. Ich möchte aber die DOPPELTEN TAGS mit foreach (array_unique($articles) as $article) AUSSORTIEREN, sodass ich folgendes Ergebnis erhalte:

                wenn du an den Ausgangsarrays nichts ändern kannst(willst) bleibt die wohl nur eine doppelte foreach-Schleife:

                $articles = array($article1, $article2, $article3);  
                  
                $uniqueTags = array();  
                foreach($articles as $article) {  
                	foreach($article as $tag) {  
                		if(!in_array($tag, $uniqueTags))  
                			$uniqueTags[] = $tag;  
                	}  
                }  
                print_r($uniqueTags);
                

                vg ichbinich

                --
                Kleiner Tipp:
                Tofu schmeckt am besten, wenn man es kurz vor dem Servieren durch ein saftiges Steak ersetzt...
                1. Hallo

                  wenn du an den Ausgangsarrays nichts ändern kannst(willst) bleibt die wohl nur eine doppelte foreach-Schleife:

                  $articles = array($article1, $article2, $article3);

                  $uniqueTags = array();
                  foreach($articles as $article) {
                  foreach($article as $tag) {
                  if(!in_array($tag, $uniqueTags))
                  $uniqueTags[] = $tag;
                  }
                  }
                  print_r($uniqueTags);

                  
                  >   
                    
                  Danke für den ansatz. Wie bekomme ich aber damit die arraywerte $article['tag'] und $ article ['tag2']?  
                    
                  Gruß, Nicki
                  
                  1. Hallo,

                    Danke für den ansatz. Wie bekomme ich aber damit die arraywerte $article['tag'] und $ article ['tag2']?

                    Wofür breuchst du die denn nun weider? In deinem Posting hast du geschrieben, du möchtest alle Tags haben, nur keine doppelten. Genau das macht mein Code-Schnipsel.

                    1. Woher kommen deine Artikel (Datenbank,...)?
                    2. Was genau willst du erreichen mit der Liste der eindeutigen Tags?

                    Ich denke, wie bereits von anderen gesagt, es macht keinen Sinn hier weiter herumzudoktorn, statt dessen sollte man das von grund auf neu strukturieren.

                    vg ichbinich

                    --
                    Kleiner Tipp:
                    Tofu schmeckt am besten, wenn man es kurz vor dem Servieren durch ein saftiges Steak ersetzt...
              2. hi Nicki,

                Ich kapiere nicht, was du weglassen willst und was rauskommen soll.

                Wenn ich ganz normal die Arrays mittels foreach ($articles as $article) auslesen lasse, bekomme ich folgende Tags im Footermenü angezeigt:

                Web, Design, Web, Programmierung, Seo, Design

                *************************************

                Das ist schon soweit gut. Ich möchte aber die DOPPELTEN TAGS mit foreach (array_unique($articles) as $article) AUSSORTIEREN, sodass ich folgendes Ergebnis erhalte:

                Web, Design, Programmierung, Seo

                *************************************

                Das aussortieren klappt aber nicht, ich erhalte als Ergebnis nur die ersten zwei arrays:

                Web, Design

                *************************************

                Das sind keine zwei Arrays, das sind zwei Werte in einem Array.

                Hast du hier gesehen https://forum.selfhtml.org/?t=217859&m=1498015. Das tut eigentlich das, was du willst.

                Ich denke, deine Anlage der Arrays ist "verkehrt".

                mfg

                tami

                1. Hi tami,

                  Ich denke, deine Anlage der Arrays ist "verkehrt".

                  Wie würdest du es machen?

                  Gruß, Nicki

                  1. hi Nicki,

                    Hi tami,

                    Ich denke, deine Anlage der Arrays ist "verkehrt".

                    Wie würdest du es machen?

                    Die Frage ist, warum du deine Arrays so angeordnet hast.

                    Du hast: Web-Design, Web-Programmierung und Seo-Design.

                    Was ist Seo-Design? Du willst Sub-menüs haben? Web/SEO und dann Programmierung/Design?

                    Was soll tag(0) und tag2 heißen? Warum machst du nicht:

                    $articles["web"][]="Programmierung";
                    $articles["web"][]="Design";
                    $articles["SEO"][]="Design"?

                    Du brauchst erstmal einen logischen Aufbau deiner Daten. $articles(0), $articles1, $articles2 ist mMn. keine sinnige Idee...;

                    mfg

                    tami

                    1. Hi tami

                      Die Frage ist, warum du deine Arrays so angeordnet hast.

                      Du hast: Web-Design, Web-Programmierung und ..

                      Schau dir doch bitte nochmal mein Startposting genau an. Ich habe für jeden artikel ein array angelegt. Die haben dann jeweils werte, die ich gezielt abrufen kann. Pro Artikel z.b. 2 tags.

                      Gruß, Nicki

                      1. hi Nicki,

                        Schau dir doch bitte nochmal mein Startposting genau an. Ich habe für jeden artikel ein array angelegt. Die haben dann jeweils werte, die ich gezielt abrufen kann. Pro Artikel z.b. 2 tags.

                        Ich verstehe nicht, was Web oder SEO für ein Artikel ist. Und was SEO-Design sein soll. Es macht aber nur Sinn, an Listen rumzudoktorn, wenn man kapiert, was damit geschehen soll und wo die Daten herkommen. Meine Schreibweise ist übrigens im Grunde eine Alternative zu Deiner. Zudem zerlegst Du Dein Array in einen Sting (was mit implode besser ginge), schreibst es als Text in eine Datei, liest es dann wieder aus, um den String wieder in ein Array zu verwandeln. Und statt gleich ein zweidimensionales Array anzulegen, legst Du erst einzelne Variablen mit Nummern an. Das macht keinen Sinn für mich. Wie ich schon schrieb. Vermutlich kann ich dir da einfach nicht helfen, sorry.

                        mfg

                        tami

              3. Hallo Nicki,

                wenn du schon Mal soweit bist,

                Wenn ich ganz normal die Arrays mittels foreach ($articles as $article) auslesen lasse, bekomme ich folgende Tags im Footermenü angezeigt:

                Web, Design, Web, Programmierung, Seo, Design

                dann hast du dein Ziel doch schon beinahe erreicht. Anstatt diese Auflistung auszugeben, speichere sie in ein Array und lass dir davon die unterschiedlichen Werte ausgeben:

                $article1 = array();  
                $article1['tag'] = 'Web';  
                $article1['tag2'] = 'Design';  
                  
                $article2 = array();  
                $article2['tag'] = 'Web';  
                $article2['tag2'] = 'Programmierung';  
                  
                $article3 = array();  
                $article3['tag'] = 'Seo';  
                $article3['tag2'] = 'Design';  
                  
                  
                $articles = array($article1, $article2, $article3); // besser die einzelnen Artikel gleich als Elemente von $articles anlegen  
                  
                $tags = array();  
                  
                foreach ($articles as $article) {  
                  
                	$tags[] = $article['tag'];  
                	$tags[] = $article['tag2'];  
                }  
                  
                var_dump(array_unique($tags));  
                  
                /*  
                array(4) {  
                   [0]=>  
                   string(3) "Web"  
                   [1]=>  
                   string(6) "Design"  
                   [3]=>  
                   string(14) "Programmierung"  
                   [4]=>  
                   string(3) "Seo"  
                 }  
                */
                

                Ich gebe tami allerdings insofern Recht, dass die Struktur deiner Daten vermutlich verbesserungswürdig ist.

                Viele Grüße und ein schönes Wochenende
                Claudius

                1. Hallo Claudius,

                  Dann hast du dein Ziel doch schon beinahe erreicht. Anstatt diese Auflistung auszugeben, speichere sie in ein Array und lass dir davon die unterschiedlichen Werte ausgeben:

                  Vielen Dank!! Jetzt kann ich auch die Geschichte mit dem einlesen/ausgeben in/aus Datei endlich rausschmeißen! Genau auf diese Lösung wollte ich hinaus! So klappt es super! Danke nochmal!

                    
                                $tags = array();  
                                foreach ($articles as $article) {  
                                        $tags[] = $article['tag'];  
                                        $tags[] = $article['tag2'];  
                                }  
                                //var_dump(array_unique($tags));  
                                foreach (array_unique($tags) as $tag) {  
                                echo "<a href='index.php?tg=$tag'>$tag</a> ";  
                                }  
                                ?>  
                  
                  

                  Viele Grüße
                  Nicki

          2. Hallo

            array(6) {

            [0]=> array(17) {["tag"]=> string(13) "Web" ["tag2"]=> string(10) "Design"}
            [1]=> array(17) {["tag"]=> string(13) "Web" ["tag2"]=> string(10) "Programmierung"}
            [2]=> array(17) {["tag"]=> string(13) "Seo" ["tag2"]=> string(10) "Design"}
            }

            
            >   
            > > Was sagt var\_dump(array\_unique($articles));?  
            >   
            > ~~~php
              
            
            > array(1) {  
            > [0]=> array(17) {["tag"]=> string(13) "Web" ["tag2"]=> string(10) "Design"}  
            > }  
            > 
            
            

            Und hier werden nur die ersten zwei ausgegeben.

            Works as designed. Die Doku zur Funktion sagt explizit: „Note: Note that array_unique() is not intended to work on multi dimensional arrays.“ aber genau das machst du wie ganz oben zu sehen ist.

            Du testest "falsch". Teste ohne das HTML-Zeugs, bis du die Variablen ausspucken kannst, die du brauchst. Dann bau den HTML-Krempel drumrum.

            Bringt das gleiche Ergebnis.

            Logtisch. Die selben Daten werden auf dem selben Weg verarbeitet. Dennoch ist der test ohne zusätzlichen Klimbim (hier HTML) empfehlenswert. Wenn das erwartet Ergebnis reproduzierbar ist, kannst du den vormaligen Ballast wieder hizufügen.

            Tschö, Auge

            --
            Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.
            Terry Pratchett, "Wachen! Wachen!"
            ie:{ fl:| br:> va:) ls:[ fo:) rl:( ss:| de:> js:| zu:}
            Veranstaltungsdatenbank Vdb 0.3
  2. hi Nicki,

    foreach($articles as $article) {
      fwrite ($handler, $article['tag'].'|');
      fwrite ($handler, $article['tag2'].'|');
    }
    Leider klappt das nicht, wie könnte ich das besser machen?

    Dein Ansatz bleibt merkwürdig. Vermutlich suchst du:

      
    foreach($articles as $article) {  
      $tags = $article['tag'];  
    }  
    
    

    mfg

    tami