sprintf met array

Door Iltar van der berg, 20 jaar geleden, 6.175x bekeken

Ik had iets nodig voor mijn talen systeem, maar daarbij werkte gewoon sprintf niet omdat ik alles in een array aangeleverd kreeg.

Daarom heb ik deze functie geschreven

Edit:

Door blanche:==================================
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php
$output
= "\$output = sprintf('" . $input . "', ";

foreach($array as $key => $value)
{

    $output .= "'" . $value . "', ";
}


$output  = substr($output, 0, -2);
$output .= ');';
?>

vervangen door:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$output
= "\$output = sprintf('" . $input . "', '" . implode("', '", $array) . "');";
?>

Gesponsorde koppelingen

PHP script bestanden

  1. sprintf-met-array

 

Er zijn 17 reacties op 'Sprintf met array'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Frank -
Frank -
20 jaar geleden
 
0 +1 -0 -1
Waarom gebruik je eval()? Dat is erg eval en nooit nodig, kan eigenlijk alleen maar voor (veiligheids) problemen zorgen.
Iltar van der berg
iltar van der berg
20 jaar geleden
 
0 +1 -0 -1
Vertel jij mij dan maar eens hoe ik het moet verbeteren...

De reden dat ik eval gebruik, is omdat ik geen functie kon vinden die het beter kon, en omdat je nooit gebruikers input erdoor moet halen...
Jurgen assaasas
Jurgen assaasas
20 jaar geleden
 
0 +1 -0 -1
Kan iemand mij vertellen wat er nou handig is aan sprintf, ik ken de functie alleen zie ik er weinig nut van in.
Joren de Wit
Joren de Wit
20 jaar geleden
 
0 +1 -0 -1
Ik ben ook benieuwd Frank, hoe je hier een andere oplossing voor zou zien?

Verder wat betreft het script: ik zou in plaats van de foreach loop kiezen voor implode(). Dan heb je ook die substr() niet meer nodig om die laatste komma en spatie te verwijderen...
Iltar van der berg
iltar van der berg
20 jaar geleden
 
0 +1 -0 -1
@blanch, dat zal ik even uittesten :)
Edit:

dat krijg het niet voor elkaar met implode, want dan heb je die '' er niet omheen.
Iltar van der berg
iltar van der berg
20 jaar geleden
 
0 +1 -0 -1
Stel je hebt een taal bestand, Daarin komt text en een getal:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$text_array
['index.php']['total_number'] = 'There are a total of %s scripts in our database and %s users';
?>


Nu is het ook in het nederlands
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$text_array
['index.php']['total_number'] = 'Er zijn %s scripts in de database en %s gebruikers';
?>


Het heeft geen zin om de zin op te splitsen in 3 delen, want sommige talen hebben een andere zins opbouw.
Daarom gebruik je sprintf:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
$count1
= 19;
$count2 = 43;
echo sprintf($text_array['index.php']['total_number'], $count1, $count2);
?>


resultaat:
There are a total of 19 scripts in our database and 43 users
Er zijn 19 scripts in de database en 43 gebruikers
Joren de Wit
Joren de Wit
20 jaar geleden
 
0 +1 -0 -1
Het kan wel Iltar, kijk maar eens naar dit voorbeeldje:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
$input
= 'The quick brown %s jumped over the lazy %s';
$array = array('fox', 'dog');

eval("echo sprintf('".$input."', '".implode("', '", $array)."');");
?>
Iltar van der berg
iltar van der berg
20 jaar geleden
 
0 +1 -0 -1
Ach niet aan gedacht zal ik even testen :)
Frank -
Frank -
20 jaar geleden
 
0 +1 -0 -1
Ik vind de hele opzet raar, er is bv. geen enkel verband tussen de diverse gegevens. Een foutje in de string of in de array zal hele vreemde resultaten opleveren, onderhoud in de tekst betekent ook dat je de array's met data moet gaan aanpassen:
$string = '%s. something like %s, is wrong.';
$array = array('right?', 'this');

Daarnaast zou ik taalbestanden oplossen met een database, gettext() of XML (of een combinatie van technieken). Deze oplossingen zijn te valideren en er zijn eenvoudig alternatieven aan te bieden wanneer een vertaling (nog) niet beschikbaar is. Dat gaat je met bovenstaande aanpak niet lukken.
Iltar van der berg
iltar van der berg
20 jaar geleden
 
0 +1 -0 -1
Dit is ook enkelt en alleen de functie sprintf_array()...

Zelf heb ik een hele class gebouwd waarin ik de texten uit een bestand ophaal etc..
Dit heb ik alleen gemaakt omdat ik het hoe dan ook in een array aangeleverd krijg. Omdat er mss wel meer met dit porbleem zijn, heb ik dus deze functie erop gezet. Als je wilt dat ik de hele class voor taal bestand erop zet moet je het zeggen.
Frank -
Frank -
20 jaar geleden
 
0 +1 -0 -1
Iltar van der berg
iltar van der berg
20 jaar geleden
 
0 +1 -0 -1
Zegt mij niet veel om eerlijk te zijn...
Jelmer -
Jelmer -
20 jaar geleden
 
0 +1 -0 -1
vsprintf, of anders wanneer je die functie niet zou kennen, zou ik call_user_func_array hebben gebruikt:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
echo call_user_func_array('sprintf', array_merge(array('Tekst %s & %s'), array($arg1, $arg2)));
?>


Voordeel is dat je niet rare effecten krijgt wanneer een van je variabelen een ' bevat. In jouw eval-gebruikende implementatie zou je precies hetzelfde effect krijgen als dat wat je hebt bij SQL-injection.
Iltar van der berg
iltar van der berg
20 jaar geleden
 
0 +1 -0 -1
ik ga gewoon over op vsprintf... Die zag ik nerges staan toen ik bij sprintf keek...
Jelmer -
Jelmer -
20 jaar geleden
 
0 +1 -0 -1
Het is inderdaad ook een beetje ondergeschoven kindje. Als je op de pagina van printf kijkt, die je een verwijzing naar vprintf. Pas op die pagina staat een verwijzing naar vsprintf. Ik ken hem ook pas relatief kort, kwam hem bij toeval toen tegen.
PHP erik
PHP erik
20 jaar geleden
 
0 +1 -0 -1
Ik zou ook gettext gebruiken. In PHP kun je dan beter Zend_Translate gebruiken omdat deze beter is dan de PHP gettext extensie, plus je hoeft die extensie dan ook niet te laden. http://framework.zend.com/manual/en/zend.translate.html. Zend_Translate heeft ook ondersteuning voor XML/CSV/etc/etc, je kunt gewoon zelf je adapter kiezen. Verder werkt het precies zoals _(verwacht).
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Iltar van der berg
iltar van der berg
20 jaar geleden
 
0 +1 -0 -1
Ik denk dat ik dan mijn volgende project met het zend framework ga maken. Is een mooie oefening :)

Om te reageren heb je een account nodig en je moet ingelogd zijn.

Inhoudsopgave

  1. sprintf-met-array

Labels

  • Geen tags toegevoegd.

Navigatie

 
 

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.