1e woord tussen <span></span>
ik heb een database waarde genaamd $row_product['weergave']
Daarin zit bijvoorbeeld:
1+1 gratis
2e halve prijs
Nou haal ik deze uit de database en explode ik deze en stop ik deze vervolgens in de DIV:
Code (php)
Elke keer als er een aktie uit de database geladen wordt moet het eerst ge-explode woord tussen <span> en de rest moet tussen <strong>
Nu werkt bovenstaande wel bij 2e halve prijs, maar niet bij 1+1 gratis, want 1+1 gratis zijn maar 2 woorden.
Hoe kan ik dit wel voor elkaar krijgen?
Op PHPhulp gaan ze kinderachtig verwijzen naar zichzelf.
Je zou kunnen kijken of het eerste teken een 1 is (met $string{0} == '1').
Zo ja: dat veranderen.
Wat je ook (vooraf) kan doen is dit:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
// even valsspelen
$row_product['weergave'] = '1+1 gratis';
$actie = $row_product['weergave']; // vanuit database
$actie = str_replace("+", " +", $actie); // zo krijg je losse delen met je +
list($span, $strong) = explode(' ', $actie, 2); // krijg 2 delen met spaties!
echo '<div id="ballon">
<span>'.$span.'</span>
<strong>'.$strong.'</strong>
</div>';
?>
// even valsspelen
$row_product['weergave'] = '1+1 gratis';
$actie = $row_product['weergave']; // vanuit database
$actie = str_replace("+", " +", $actie); // zo krijg je losse delen met je +
list($span, $strong) = explode(' ', $actie, 2); // krijg 2 delen met spaties!
echo '<div id="ballon">
<span>'.$span.'</span>
<strong>'.$strong.'</strong>
</div>';
?>
Door de 2 in de explode() zal hij stoppen bij 2 delen. Dus de andere spaties blijven bestaan. Door een spatie toe te voegen aan de plus, zal hij daar splitsen.n.
En het is actie met een C, niet met een K.
Online: http://codepad.org/v2rWaO7g
Toevoeging op 29/08/2012 08:41:18:
In het kort:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
$str = explode(' ', str_replace("+", " +", $row_product['weergave']), 2);
echo '<div id="ballon">
<span>'.$str[0].'</span>
<strong>'.$str[1].'</strong>
</div>';
?>
$str = explode(' ', str_replace("+", " +", $row_product['weergave']), 2);
echo '<div id="ballon">
<span>'.$str[0].'</span>
<strong>'.$str[1].'</strong>
</div>';
?>
Gewijzigd op 29/08/2012 08:38:01 door Eddy E
Tevens vind ik het ook een beetje flauw om het handelen van 1 iemand meteen toe te wijzen aan het handelen van 'heel phphulp'.
En ja, topics op 2 forums posten is irritant. Wij doen hier ons best, terwijl het daar nu al is opgelost.
Met strpos() heb je leuk de positie van de eerste spatie, maar meer niet. En met substr() kan het ongetwijfeld ook, maar of dat beter is?
Het kan ook inderdaad met substr() of zelfs met 1 regel preg_replace():
Code (php)
1
2
3
4
5
2
3
4
5
<?php
echo '<div id="ballon">
<span>'.preg_replace('/ /', '</span> </strong>', $row_product['weergave'], 1).'</strong>
</div>';
?>
echo '<div id="ballon">
<span>'.preg_replace('/ /', '</span> </strong>', $row_product['weergave'], 1).'</strong>
</div>';
?>
Zo zijn er wel tientallen manieren. Ik geef er een die ikzelf duidelijk en overzichtelijk vindt.
Heel PHPhulp was inderdaad wat overdreven. Had het beter persoonlijk kunnen houden.
Toch is de eerste reactie op een hulppost vaak wel toongevend. Als dat alleen maar verwijzend is naar een ander (eigen) topic, vind ik dat flauw. Alsof hij dat zelf niet weet/ziet.
Blijkbaar zijn ze op PFZ sneller en behulpvaardiger?
Ik probeer hier dan ook hulpvaardig te zijn, maar krijg weer over me heen dat het niet goed genoeg is. Waar is jouw betere oplossing? En waarom zet je die niet neer, i.p.v. mij aan te spreken?
Wat ik wel weet is dat ik de preg oplossing niet zou gebruiken, dat vertraagd je script aanzienlijk.
En natuurlijk, de reactie van O&I is soms een beetje te kort door de bocht. Maar cross-posting is wel waar mensen zich aan ergeren. Zie ook de uitleg van O&I: http://www.phphulp.nl/php/forum/topic/code-herhaalt/86361/#618761
Om toch nog flink ontopic te eindigen:
Mijn oplossing zou dit zijn:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
<?php
// haal de positie op van de eerste spatie in de string
$pos = strpos($str, ' ');
// met substr pak je alle tekst vanaf het begin (0) totaan de positie van de spatie
// en dat plaatsen we tussen <em> (kun je veranderen in elke tag of tekst die je wilt)
$span = '<em>'.substr($str, 0, $pos).'</em>';
// vervolgens echoën we dat eerste woordje met het element en daarna de tekst vanaf
// de positie van de spatie
echo $span.substr($str, $pos);
?>
// haal de positie op van de eerste spatie in de string
$pos = strpos($str, ' ');
// met substr pak je alle tekst vanaf het begin (0) totaan de positie van de spatie
// en dat plaatsen we tussen <em> (kun je veranderen in elke tag of tekst die je wilt)
$span = '<em>'.substr($str, 0, $pos).'</em>';
// vervolgens echoën we dat eerste woordje met het element en daarna de tekst vanaf
// de positie van de spatie
echo $span.substr($str, $pos);
?>
En welke van de 3 oplossing het snelst is? http://phphulp.wouterj.nl/PHPbench/?test=first-word-highlight
Dan wint de eerste optie van jou.
PS: Bij het maken van mijn voorbeeld code leek het toch wat ingewikkelder dan ik dacht.
Wouter J op 29/08/2012 12:01:26:
En welke van de 3 oplossing het snelst is? http://phphulp.wouterj.nl/PHPbench/?test=first-word-highlight
Dan wint de eerste optie van jou.
Dan wint de eerste optie van jou.
Offtopic:
Ja, en voor welke optie ga je dan? De snelste, of de meest overzichtelijke. Vroeg je me dat een jaar geleden dan had ik gezegd: voor de snelste! Vraag je me het vandaag, dan denk ik dat ik zou zeggen: voor de meest overzichtelijke. Dan kan ik namelijk snel en makkelijk zien wat de code doet. Maar theoretisch wordt je website er dus iets "trager" van.
Gewijzigd op 29/08/2012 12:11:04 door Ozzie PHP
Of je nou explode() of strpos()/substr() gebruikt maakt elkaar ook bar weinig.... 16% van 5 microseconde = 0,8 microseconde....
Jouw manier kan inderdaad net zo makkelijk. Beetje lood om oud ijzer.
Dus is het er voor gebouwd? Ik zou zeggen: niet voor dit soort simpele acties.
ten eerste bedankt voor de vele reacties!
Ik heb een hoop los gemaakt merk ik, was niet mijn bedoeling.
De reden dat ik mijn topic op meerdere sites plaats is enkel omdat ik dan verschillende oplossingen krijg waaruit ik achteraf de beste kan kiezen.
Daarbij geeft de ene persoon meer uitleg bij een script dan de ander, waardoor ik het beter kan begrijpen.
Het was dus niet mijn bedoeling mensen ergernis te bezorgen.
Ik heb uiteindelijk gekozen voor het script van Wouter J, aangezien mij dat het meest duidelijk is.
Het geeft overzichtelijk weer wat het doet waardoor ik het begrijp wanneer ik later nog aan het script zal werken.
Bedankt voor de hulp!
Het betreft hier een beperkt aantal verschillende strings die waarschijnlijk wel vaak voorkomen. Ik zou dan ook in de database de kortingen opslaan als codes, bijvoorbeeld:
1 => 1+1 gratis
2 => 2e halve prijs
3 => 4e gratis
4 => 30% korting
(etc)
Voor je database is dat ook interessant, want zo kun je veel efficiënter een query uitvoeren waarin je alle producten opvraagt met een bepaalde korting.
Vervolgens maak je (bijvoorbeeld, want er zijn verschillende manieren om dit op te lossen) een array waarin de HTML-code van de ballon-divs zit:
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
$kortingkreten = array (
1 => '<div id="ballon"><span>1+1</span><strong>gratis</strong></div>',
2 => '<div id="ballon"><span>2e</span><strong>halve prijs</strong></div>',
3 => '<div id="ballon"><span>4e</span><strong>gratis</strong></div>',
4 => '<div id="ballon"><span>30%</span><strong>korting</strong></div>',
);
?>
$kortingkreten = array (
1 => '<div id="ballon"><span>1+1</span><strong>gratis</strong></div>',
2 => '<div id="ballon"><span>2e</span><strong>halve prijs</strong></div>',
3 => '<div id="ballon"><span>4e</span><strong>gratis</strong></div>',
4 => '<div id="ballon"><span>30%</span><strong>korting</strong></div>',
);
?>
Tijdens het verwerken van je producten kun je dan aan de hand van de kortingscode de bijbehorende string echo'en:
Veel efficiënter dan voor elke rij de string ontbinden en weer aan elkaar plakken.
Gewijzigd op 30/08/2012 18:38:15 door Willem vp
Helemaal mee eens. Zeker als het een X-aantal vaste kreten zijn. Je geeft nooit 15,4% korting of 128+3 gratis...
En als je dat toch wilt doen, is het eenvoudig toe te voegen. ;-)
echter wil ik alles via een admin panel kunnen beheren.
Zo ook de aktiekreten en vandaar ook mijn keuze om het op deze manier aan te pakken.
Anders dien ik toch weer in het script aanpassingen te maken wanneer nodig.
Je kan die actie-kreten ook in een tabel zetten. Toch? En daarin gewoon HTML gebruiken.
Wat versta je onder admin panel? phpMyAdmin oid? In dat geval zul je een geel briefje met de codes aan je monitor moeten hangen. ;-) Of je gebruikt geen integers, maar korte strings als "1+1G", "2eHP", "30%", "4eG", etc. Voor de database is dat wel weer minder efficiënt.
Gewijzigd op 30/08/2012 19:08:20 door Willem vp
Zoals bij een CMS, daarin zijn dus ook de actiekreten toe te voegen en te verwijderen.
De kortingskreten zelf staan ook in de database.
En via het admin-gedeelte kan je dus actiekreten toevoegen.
Je zou het dan in het admin panel zo kunnen maken dat ze op 'Geef korting' kunnen klikken, vervolgens kunnen ze kiezen uit een aantal standaard zinnen die al op de website staat, staat die van hun er niet tussen? Dan maak je een + buttontje ofzo waardoor ze de zien kunnen toevoegen.
Is gebruikersvriendelijker en beter voor je database (beter genormalizeerd)
Maar dan voegen ze die toch ook toe aan de database?
Ja, dat is dan ook precies de bedoeling. Wil je dat 'gebruikers' niets kunnen toevoegen, dan geef jij hen de rechten daartoe niet (jezelf wel uiteraard).