Doppelte Einträge ausfiltern.

Hmm, das konnte ja keiner ahnen ;-)

Du könntest es aber so machen: Bei jedem foreach-Durchlauf merkst du dir das Array in einer weiteren Variable und machst du ein array_merge mit dem gemerkten und dem des aktuellen Durchlaufs.

Unterhalb des foreach machst du dann ein array_unique.
 
Ja, alxy und Saftmeister - und genau da hören irgendwie meine PHP Kenntnisse auf ;-)

Das was alxy da geschrieben hat, sieht schon mal "interessant" aus. Verstehe aber nicht, wo das $value herkommt und wie ich das in meinem Code einbauen müsste.

Also dieser Code geht bei mir durch alle Datensätze und zieht hier den Inhalt aus dem Feld "tags" welches ich mit explode() zerlege. In der weiteren foreach() Schleife werden alle Tags aufgelistet. Und in dieser Liste habe ich dann die doppelten Tags:

PHP:
foreach($result as $value) {
  $stags = explode(",", $value['tags']);
  foreach($stags as $var) { 
    echo "<li><a href='#' data-filter='." . $var . "'>" . $var . "</a></li>";
  }
}
 
Ungefähr so?

PHP:
$gemerkt = array();

foreach($result as $value) {
  $stags = explode(",", $value['tags']);
  $gemerkt = array_merge($gemerkt, $stags);
  foreach($stags as $var) { 
    echo "<li><a href='#' data-filter='." . $var . "'>" . $var . "</a></li>";
  }
}
//$gemerkt = array_unique($gemerkt);

var_dump($gemerkt);

EDIT: Das array_unique() ist aufgrund des array_merge() überflüssig, da array_merge() bereits doppelte Einträge ignoriert.
 
PHP:
$gemerkt = array();

foreach($result as $value) {
  $stags = explode(",", $value['tags']);
  $gemerkt = array_merge($gemerkt, $stags);
}
$gemerkt = array_unique($gemerkt);

foreach($gemerkt as $nvar) {
  echo "<li><a href='#' data-filter='." . $nvar . "'>" . $nvar . "</a></li>";
}

Das ist jetzt der fertige Code, womit es funktioniert.
Wenn ich das array_unique() weglasse, zeigt er wieder alle an.

Vielen Dank euch Beiden, ihr habt mir sehr damit geholfen.


Gruß
Torsten
 
saftmeister: nö, nur doppelte, nicht numerische SCHLÜSSEL werden ignoriert.

@c3x: einfach meinen code for deine foreach-Schleife packen und die $result variable durch $uniqueTags ersetzen. Enjoy the magic! :D

Übrigens: Was du da grade gebastelt habe, hab ich bereits in meinem ersten Post beschrieben :p

edit// Falls du Interesse an ner Erklärung meines Codes hast, sag bescheid, dann schreib ich das auf. Sonst nicht:D
 
Zuletzt bearbeitet:
Echt? Hmmm ... War wohl im ersten Moment für mich nicht so nachvollziehbar.

Klar, bin immer an Erklärungen interessiert - auch mit 47 Jahren lernt man noch gerne dazu ;-)
 
Sowas?

PHP:
<?php

$result = array(
	'Tag1,Tag2,Tag3',
	'Tag2,Tag4,Tag6',
	'Tag7,Tag4,Tag8'
	);

$tags = call_user_func_array('array_merge', array_map(function($value) {
	return explode(',', $value);
}, $result));

$uniqueTags = array_unique($tags);

var_dump($uniqueTags);

edit// Ich bin nicht ganz sicher aber welcher php version das lauffähig ist, entweder 5.3 oder 5.4

OK, dann hier die Erklärung.
Zunächst mal $result ist nur das gefakete Testarray, so wie ich vermute, das dein $result array aussieht.
Dann werden zwei geschachtelte Funktionen benutzt, zunächst möchte ich mal array_map erklären: http://de3.php.net/manual/de/function.array-map.php
Diese wendet die als ersten Paramter übergebene Funktion (das ist diese anonyme Funktion, also function($value) { } )auf jedes Element von dem als zweiten Paramter ($result) übergebenem Array an. und gibt dann entsprechend ein array zurück, in dem die Werte stehen, nachdem die Funktion angewendet wurde. In diesem Fall wurde explode auf jedes Element ($value) angewendet. Die Rückgabe ist entsprechend ein mehrdimensionales array. Dieses mehrdimensionaly Array muss nun in ein eindimensionales mit allen Tags verwandelt werden, damit dann array_unique darauf angewendet werden kann. Und da kommt dann array_merge ins Spiel. Theoretisch müsste ich alle Unterarrays auf dem mehrdimensionalen array an array_merge übergeben (als Parameter). Und genau das macht call_user_func_array(). Dadurch werden alle Elemente des arrays (zweiter Paramter) als Parameter an die als erstes Argument angegeben Funktion (array_merge) übergeben. Auf dieses "geflattete" array kannst du dann array_unique anwenden.

Im Prinzip sind diese drei zeilen genau das, was du gemacht hast. Nur kürzer :p
 
Erstmal vielen Dank für die Mühe und die Erklärung.

Das Thema interessiert mich ja schon und deswegen habe ich heute noch etwas rumprobiert.

PHP:
foreach($result as $value) {

  $tags = call_user_func_array('array_merge', array_map(function($value) { return explode(',', $value); }, $result));
  $uniqueTags = array_unique($tags);

var_dump($uniqueTags);

}

Allerdings bringt mir bereits ein

PHP:
var_dump($tags);

nur ein "NULL NULL NULL NULL NULL".


Meine PHP Version ist übrigens PHP 5.4.4.
 
Du musst das nicht in die foreach Schleife packen.
Die $value Variable musst du auch nirgendwo deklarieren.

mach mal ein var_dump $result bitte. Das sollte ja ca so aussehen wie man testarray. Funktioniert der Code, wenn du genau meine Lösung kopierst?
 
Ja, dein Code würde so funktionieren.


Ein var_dump() sieht bei mir allerdings etwas anders aus:

PHP:
array(5) { 

  [0]=> array(24) { 
    [0]=> string(1) "1" ["id"]=> string(1) "1" 
    [1]=> string(30) "Titeltext" ["title"]=> string(30) "Titeltext" 
    [2]=> string(66) "Beschreibungstext" ["desc"]=> string(66) "Beschreibungstext" 
    [3]=> string(15) "Tag1,Tag2,Tag3" ["tags"]=> string(15) "Tag1,Tag2,Tag3" 
    [4]=> string(1) "1" ["format"]=> string(1) "1" 
    [5]=> string(5) "20:14" ["size"]=> string(5) "20:14" 
    [6]=> string(10) "2014-01-16" ["ondate"]=> string(10) "2014-01-16" 
    [7]=> string(1) "1" ["site"]=> string(1) "1" 
    [8]=> string(1) "1" ["created_by"]=> string(1) "1" 
    [9]=> string(19) "2014-01-16 18:16:21" ["created"]=> string(19) "2014-01-16 18:16:21" 
    [10]=> string(1) "1" ["modified_by"]=> string(1) "1" 
    [11]=> string(19) "2014-01-16 18:25:22" ["modified"]=> string(19) "2014-01-16 18:25:22" 
  } 

  [...]

}

Ich ziehe per SELECT * alles aus der Tabelle, da ich ja auf der gleichen Seite die vollständigen Datensätze nebeneinander ausgebe.

Vielleicht sollte ich das dann besser über ein zweites SELECT machen, so dass ich mir nur die Daten aus dem Feld tags hole?
 
Zurück