* als replacement symbool?

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: « vorige 1 2

Willem vp

Willem vp

11/01/2014 09:12:13
Quote Anchor link
Ozzie PHP op 11/01/2014 01:25:41:
>> Eventueel zou je dus nog wel die ene %s kunnen vervangen door %s
Wat bedoel je?

Zie het tweede codefragment hier. Maar de oplossing van Koen (zie vorige bericht) vind ik eigenlijk sjieker.
Quote:
>> In dat geval ga je een null value voeren aan een placeholder en dat is nooit aan te bevelen...
Nou het werkt sowieso niet, want beide %s worden dan vervangen :(

Tsja, dat is een PHP-dingetje. Daar werkt (s)printf net weer iets anders dan in de rest van de wereld. :)


Toevoeging op 11/01/2014 09:17:15:

Wouter J op 11/01/2014 07:48:04:
>> en dat dan alleen die laatste %s wordt vervangen?

Enof dat werkt. Lees eens de uitleg bij sprintf...

Doel je hier op %2$s ? Dat werkt precies de andere kant uit. Je moet dan al twee parameters aanbieden. Als je 2 type specifiers hebt en slechts 1 parameter aanbiedt, werkt dat niet.
Gewijzigd op 11/01/2014 09:14:26 door Willem vp
 
PHP hulp

PHP hulp

27/05/2026 14:20:26
 
Ozzie PHP

Ozzie PHP

11/01/2014 10:36:09
Quote Anchor link
Koen Vlaswinkel op 11/01/2014 07:54:52:
Dit werkt:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
$string
= 'dit is %%s %s'; // dit is de begin-string
$string = sprintf($string, 'test'); // string moet nu worden 'dit is %s test';
$string = sprintf($string, 'een');  // string moet nu worden 'dit is een test';
?>

Zo hé, die werkt perfect! Nice :-) Kun je ook uitleggen waarom dit werkt? Ik snap dat bij de 1e sprintf de laatste %s wordt vervangen, maar van %%s maakt ie %s. Waarom doet ie dat?

Wouter J op 11/01/2014 07:48:04:
>> en dat dan alleen die laatste %s wordt vervangen?

Enof dat werkt. Lees eens de uitleg bij sprintf...

Wouter, ik heb het bekeken, maar ik zie niet waar het staat. Beter gezegd, ik weet niet waar je op doelt en waar ik dit kan vinden.

Willem vp op 11/01/2014 09:12:13:
Zie het tweede codefragment hier. Maar de oplossing van Koen (zie vorige bericht) vind ik eigenlijk sjieker.

Ah sorry, die had je toegevoegd zie ik. Die had ik helemaal niet gezien! Wel grappig bedacht :-) De oplossing van Koen is inderdaad mooi, alleen weet ik niet waarom die werkt.
Gewijzigd op 11/01/2014 10:37:27 door Ozzie PHP
 
Koen Vlaswinkel

Koen Vlaswinkel

11/01/2014 10:42:39
Quote Anchor link
Normaal gesproken wordt een procentteken als iets gezien wat vervangen moet worden, en %% betekent % omdat je anders geen normaal proprocentteken zou kunnen maken. Je escaped dus eigenlijk het procentteken.

Dit zegt de manual ook bij sprintf:
Quote:
A type specifier that says what type the argument data should be treated as. Possible types:
% - a literal percent character. No argument is required.
 
Ivo P

Ivo P

11/01/2014 10:44:27
Quote Anchor link
dit betekent wel dat je dan van te voren moet weten in welke volgorde je de replacing wilt gaan doen he.

Met 2 is het nog te overzien, maar met 4 of 5 wordt het een enorme berg aan %-tekens in je strings.

Ik denk dat je dan ipv 1 string in meerdere methods aan te laten passen, het overzichtelijker is, om elke method eerst een value te laten setten, om aan het einde in 1x de string aan te passen

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?php
class foo
{
    $string = 'een string met %s of %s replacements';
    $aReplacements = array();

    function
bar1()
    {

       // doe iets leuks
       $this->aReplacements[1] = 'één';
    }


    funtion bar2()
    {

      // nog meer leuke dingen
      $this->aReplacements[2] = 'twee';
    }

    function
get_string()
    {

       return sprintf($this->string, $this->aReplacements[1], $this->aReplacements[2]);
    }

    function
aansturing()
    {

      $this->bar1();
      $this->bar2();

      echo $this->get_string();

    }
}

?>


als je wilt, kun je dit zelfs nog wel dynamisch krijgen, door in get_string() te achterhalen hoeveel keer er %s staat en dat aantal replacements te doen.
of als je met %2$s zou werken: te weten welke array-elementen je op moet pikken.
Gewijzigd op 11/01/2014 10:45:53 door Ivo P
 
Ozzie PHP

Ozzie PHP

11/01/2014 10:44:41
Quote Anchor link
Oké, tot zover volg ik je. Maar waarom maakt ie van %%s dan %s? Waarom verdwijnt een van die % tekens?

Toevoeging op 11/01/2014 10:48:36:

@Ivo, in zo'n geval kun je beter nummers gebruiken denk ik, of met placeholders werken. Maar dat is in deze situatie even niet handig. De oplossing van Koen werkt voor mijn probleem prima.
 
Koen Vlaswinkel

Koen Vlaswinkel

11/01/2014 10:49:10
Quote Anchor link
Omdat %% wordt vervangen door %. Er wordt in dit geval helemaal niet gekeken naar de s omdat je de % escaped. Hij hoort in hetzelfde rijtje:
- %s -> heeft string parameter nodig en zal daardoor worden vervangen
- %d -> heeft integer parameter nodig en zal daardoor worden vervangen
- %% -> heeft geen parameters nodig en zal altijd worden vervangen door %
 
Ozzie PHP

Ozzie PHP

11/01/2014 10:53:22
Quote Anchor link
Ah oke... ik denk dat ik je begrijp. Dus stel dat ik normaal gesproken zou willen zeggen "de korting bedraagt 10%" dan zou ik dit doen:

sprintf('de korting bedraagt %d%%', 10);

En dan heb ik dus het %-teken ge-escaped. Begrijp ik het zo goed?
 
Koen Vlaswinkel

Koen Vlaswinkel

11/01/2014 10:58:06
Quote Anchor link
Je begrijpt het goed :)
 
Ozzie PHP

Ozzie PHP

11/01/2014 11:00:28
Quote Anchor link
Ah, mooi :-)

Dat zijn weer van die leuke dingen. Nu ik begrijp hoe het werkt denk ik, jaaa!!
Maar zelf was ik er waarschijnlijk nooit op gekomen. Nice :)

Thanks Koen!!
 
Ivo P

Ivo P

11/01/2014 11:41:40
Quote Anchor link
Quote:
Maar dat is in deze situatie even niet handig. De oplossing van Koen werkt voor mijn probleem prima.


Ik probeer in zo'n geval vooruit te denken: wat als het er meer worden?
Je hebt nu het lapmiddel van %%s, maar dat werkt alleen voor het geval je de functies in de juiste volgorde aanroept, en je de %-tekens escapet. Worden het er meer, dan wordt de derde dubbelop escaped, dus %%%%s.

Dat wordt tamelijk onoverzichtelijk.
En als je dan alsnog wilt aanpassen, moet je mogelijk heel wat code aanpassen.

Ik ga in zo'n geval het liefst voor de dynamischte oplossing. Vaak genoeg meegemaakt namelijk dat iets van 1 of 2 toch doorgroeit naar 5 of 10.
 
Ozzie PHP

Ozzie PHP

11/01/2014 11:51:24
Quote Anchor link
Ik snap je punt Ivo, maar dit is een situatie die zich binnen 1 class voordoet. Het is geen algemene template renderer of iets dergelijks. In zo'n geval moet je het inderdaad anders aanpakken. Maar voor wat ik nu nodig heb werkt dit prima :)
 

Pagina: « vorige 1 2



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.