Samenvoegen van verschillende rijen in tabellen
Nu zou ik van al deze rijen het veld tags willen samenvoegen.
Even een voorbeeld:
Code (php)
1
2
3
4
2
3
4
Titel Artikel Tags
Titel 1 Artikel inhoud 1 wonen, leven, cultuur
Titel 2 Artikel inhoud 2 werken, leven, inrichten
...
Titel 1 Artikel inhoud 1 wonen, leven, cultuur
Titel 2 Artikel inhoud 2 werken, leven, inrichten
...
Nu kan je zien dat de laatste tag dus geen komma meer heeft. En ik zou al die tags willen samenvoegen. Dus dacht ik aan een str_replace
Maar dat gaat dus niet aangezien de laatste tag nooit een komma heeft.
Iemand een idee hoe dit wel kan opgelost worden?
Gewijzigd op 29/08/2016 14:15:04 door Brecht S
Maak voor de tags een extra tabel aan en koppel deze aan het artikel.
Bijvoorbeeld:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
Tag_ID Artikel_ID Tag
1 1 wonen
2 1 leven
3 1 cultuur
4 2 werken
5 2 leven
6 2 inrichten
1 1 wonen
2 1 leven
3 1 cultuur
4 2 werken
5 2 leven
6 2 inrichten
Gewijzigd op 29/08/2016 14:20:17 door Ramon van Dongen
Dit gaat nu niet meer. De database is al jaren geleden opgebouwd en er hangt een website aan. Ik zou een oplossing moeten hebben voor de huidige situatie.
Maar als je het toch zo opgeslagen wil houden; wat bedoel je precies met tags samenvoegen?
Wat wil je met de tags precies doen?
Dus wat ik wil is die tags-rijen gaan samenvoegen zoals:
wonen
werken
cultuur
inrichten
...
Maar de dubbele items moeten er ook nog wel uitgehaald worden.
Momenteel ben ik aan het zoeken in deze richting:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$sql = "SELECT tags FROM blog WHERE actief = 'ja'";
$res = mysql_query($sql) or die (mysql_error());
while($row = mysql_fetch_assoc($res))
{
$tags[] = $row;
}
//echo '<pre>';
//print_r($tags);
//echo '</pre>';
foreach ($tags as $tag) {
echo str_replace(',', '<br>', $tag['tags']) . '<br>';
}
$res = mysql_query($sql) or die (mysql_error());
while($row = mysql_fetch_assoc($res))
{
$tags[] = $row;
}
//echo '<pre>';
//print_r($tags);
//echo '</pre>';
foreach ($tags as $tag) {
echo str_replace(',', '<br>', $tag['tags']) . '<br>';
}
Dit werkt wel maar geeft nog dubbele items weer. Tags kunnen meermaals voorkomen bij verschillende artikelen, maar dit mag niet in mijn lijst.
Je had een probleem met zoeken en vervangen van een komma,
De oplossing daarvoor was goed.
Waarom kom je niet gelijk met het complete verhaal? Of komt alles bij stukjes en beetjes?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<?php
// ergens je connectie (MySQLi) maken en in $mysqli zetten
// lege array aanmaken waarin alle tags komen
$tags = array();
// de tags ophalen uit database, let op: met MySQLi
$tagsophalen = $mysqli->query("SELECT tags FROM blog WHERE actief = 'ja'");
// alleen iets doen als er uberhaupt tags zijn
if(mysqli_num_rows($tagsophalen) > 0){
// door de tags heen lopen
while($tagres = mysqli_fetch_assoc($tagsophalen)){
// splitsen op de komma
foreach(explode(',',$tagres['tags']) AS $tag){
// opslaan in de array $tags
$tags[] = $tag;
}
}
}
// ontdubbelen
$tags = array_unique($tags);
// eventueel nog op alfabetische volgorde zetten of whatever
// zie php.net
// printen
foreach($tags AS $tagnaam){
echo $tagnaam.'<br>';
}
?>
// ergens je connectie (MySQLi) maken en in $mysqli zetten
// lege array aanmaken waarin alle tags komen
$tags = array();
// de tags ophalen uit database, let op: met MySQLi
$tagsophalen = $mysqli->query("SELECT tags FROM blog WHERE actief = 'ja'");
// alleen iets doen als er uberhaupt tags zijn
if(mysqli_num_rows($tagsophalen) > 0){
// door de tags heen lopen
while($tagres = mysqli_fetch_assoc($tagsophalen)){
// splitsen op de komma
foreach(explode(',',$tagres['tags']) AS $tag){
// opslaan in de array $tags
$tags[] = $tag;
}
}
}
// ontdubbelen
$tags = array_unique($tags);
// eventueel nog op alfabetische volgorde zetten of whatever
// zie php.net
// printen
foreach($tags AS $tagnaam){
echo $tagnaam.'<br>';
}
?>
Gewijzigd op 29/08/2016 16:24:01 door Ramon van Dongen
Gewijzigd op 29/08/2016 16:57:57 door Brecht S
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php
// ergens je connectie (MySQLi) maken en in $mysqli zetten
// lege array aanmaken waarin alle tags komen
$tags = array();
// de tags ophalen uit database, let op: met MySQLi
$tagsophalen = $mysqli->query("SELECT tags FROM blog WHERE actief = 'ja'");
// alleen iets doen als er uberhaupt tags zijn
if(mysqli_num_rows($tagsophalen) > 0){
// door de tags heen lopen
while($tagres = mysqli_fetch_assoc($tagsophalen)){
if(trim($tagres['tags']) !== ''){
// splitsen op de komma
foreach(explode(',',$tagres['tags']) AS $tag){
// opslaan in de array $tags
$tags[] = $tag;
}
}
}
}
// ontdubbelen
$tags = array_unique($tags);
// eventueel nog op alfabetische volgorde zetten of whatever
// zie php.net
// printen
foreach($tags AS $tagnaam){
echo $tagnaam.'<br>';
}
?>
// ergens je connectie (MySQLi) maken en in $mysqli zetten
// lege array aanmaken waarin alle tags komen
$tags = array();
// de tags ophalen uit database, let op: met MySQLi
$tagsophalen = $mysqli->query("SELECT tags FROM blog WHERE actief = 'ja'");
// alleen iets doen als er uberhaupt tags zijn
if(mysqli_num_rows($tagsophalen) > 0){
// door de tags heen lopen
while($tagres = mysqli_fetch_assoc($tagsophalen)){
if(trim($tagres['tags']) !== ''){
// splitsen op de komma
foreach(explode(',',$tagres['tags']) AS $tag){
// opslaan in de array $tags
$tags[] = $tag;
}
}
}
}
// ontdubbelen
$tags = array_unique($tags);
// eventueel nog op alfabetische volgorde zetten of whatever
// zie php.net
// printen
foreach($tags AS $tagnaam){
echo $tagnaam.'<br>';
}
?>
Werkt het dan wel?
Sorry, maar had mijn bericht even aangepast want de code werkte toch niet. Het was mijn eigen probeersel die er nog op stond. Even je nieuwe versie aan het bekijken. Ik kreeg daarnet geen resultaat.
Brecht S op 29/08/2016 16:54:25:
@Ramon: ik heb het geprobeerd maar je code werkt niet blijkbaar. Ik krijg geen resultaten. Zal eens even kijken of er iets fout in staat.
Waarschijnlijk heeft het te maken met MySQLi ipv MySQL functies.
Ja, blijkbaar een fout getypt bij enkele aanpassingen aan je code. Nu werkt het wel en de dubbels zijn er volgens mij ook uit. Zal nog even verder checken maar op het eerste zicht is dit de juiste code. Thanks.
Snap je nu ook wat de code precies doet?
Vervolgens het uiteindelijke resultaat tonen via een foreach loop.
Ik was in de goede richting aan het zoeken maar was er totaal nog niet ;-)
Dus:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php
// ergens je connectie (MySQLi) maken en in $mysqli zetten
// lege array aanmaken waarin alle tags komen
$tags = array();
// de tags ophalen uit database, let op: met MySQLi
$tagsophalen = $mysqli->query("SELECT tags, 'EUROBLOK' AS bedrijfsnaam FROM blog WHERE actief = 'ja'");
// alleen iets doen als er uberhaupt tags zijn
if(mysqli_num_rows($tagsophalen) > 0){
// door de tags heen lopen
while($tagres = mysqli_fetch_assoc($tagsophalen)){
if(trim($tagres['tags']) !== ''){
// splitsen op de komma
foreach(explode(',',$tagres['tags']) AS $tag){
// opslaan in de array $tags
$tags[] = $tag;
}
}
}
}
// ontdubbelen
$tags = array_unique($tags);
// eventueel nog op alfabetische volgorde zetten of whatever
// zie php.net
// printen
foreach($tags AS $tagnaam){
echo $tagnaam.'<br>';
}
?>
// ergens je connectie (MySQLi) maken en in $mysqli zetten
// lege array aanmaken waarin alle tags komen
$tags = array();
// de tags ophalen uit database, let op: met MySQLi
$tagsophalen = $mysqli->query("SELECT tags, 'EUROBLOK' AS bedrijfsnaam FROM blog WHERE actief = 'ja'");
// alleen iets doen als er uberhaupt tags zijn
if(mysqli_num_rows($tagsophalen) > 0){
// door de tags heen lopen
while($tagres = mysqli_fetch_assoc($tagsophalen)){
if(trim($tagres['tags']) !== ''){
// splitsen op de komma
foreach(explode(',',$tagres['tags']) AS $tag){
// opslaan in de array $tags
$tags[] = $tag;
}
}
}
}
// ontdubbelen
$tags = array_unique($tags);
// eventueel nog op alfabetische volgorde zetten of whatever
// zie php.net
// printen
foreach($tags AS $tagnaam){
echo $tagnaam.'<br>';
}
?>
En dan onderaan ipv enkel de $tagnaam weer te geven ook de $bedrijfsnaam erbij te krijgen?
Gewijzigd op 30/08/2016 16:51:35 door Brecht S
// zie php.net
Waarom bedrijfsnaam in de SELECT wordt meegegeven is mij onduidelijk.
Verder :
Code (php)
1
2
3
4
5
6
2
3
4
5
6
// printen
$bedrijfsnaam = 'EUROBLOK';
foreach($tags AS $tagnaam) {
echo $tagnaam . ' - ' . $bedrijfsnaam . '<br>';
}
$bedrijfsnaam = 'EUROBLOK';
foreach($tags AS $tagnaam) {
echo $tagnaam . ' - ' . $bedrijfsnaam . '<br>';
}
Gewijzigd op 30/08/2016 19:21:40 door Adoptive Solution
Daarom gebruik ik in de select die bedrijfnamen omdat ik mijn tags wil koppelen met een bedrijfsnaam omdat ik anders niet weet of de tags van het ene bedrijf of van het andere bedrijf komen. De bedoeling is dat in de tag cloud die aanklikbaar zijn en dan naar de juiste pagina gaan van het bedrijf. Dus ik heb wel degelijk een bedrijfsnaam nodig.
Ik kan niet ruiken dat er nog meer is.
Heb je een oplossing?