Ik ben bezig met een script dat een woord vergelijkt met letters die één voor één uit een array worden uitgelezen.
Nu wil ik echter een "_" (underscore) krijgen op de plaats van de letter van het woord als deze niet in het array voorkomt. Met onderstaande krijg ik "ppl", terwijl ik graag _pp_l zou willen genereren. Iemand een idee hiervoor?

<?php

$woord = appel;

$arraytje = array("l","b","p","s","p");
$unieke_array = array_unique($arraytje); // overbodige letters elimineren

for ($m=0 ; $m<strlen($woord) ; $m++) { // ga alle letters van de variabele $woord 1 voor 1 af

for ($n=0 ; $n<count($unieke_array) ; $n++) { // ga alle letters van het array 1 voor 1 af

if ($woord[$m] == $unieke_array[$n]) { // indien letters overeenkomen...
echo $woord[$m];
} // if

} // for1
} // for2

?>
Ozzie PHP op 16/04/2018 12:05:47

Wel leuk dat je in zo'n geval als dit dezelfde functionaliteit op meerdere manieren kunt bereiken. Zo schrijf je waarschijnlijk heel vaak code waarvan je achteraf denkt 'kan dat niet korter of sneller'?

Toen ik begon met programmeren dacht ik dat je een bepaalde functionaliteit maar op 1 manier kon programmeren. Inmiddels besef ik dat dat op tig manieren kan.


Ik ben nog niet zo behendig om het kortste (of snelste) script te schrijven. Gelukkig zijn er mensen zoals jullie die dat sneller kunnen dan ik ;). Grappig dat mijn voorbeeld ook opgelost kan worden zonder for-lus(sen).
Gotcha: strlen() telt ook bytes, en niet per se letters/karakters.

Indien je het volgende $word opslaat in UTF-8 levert dit 6 karakters op:
<?php
$word = 'appël';
echo strlen($word);
?>
>> Gotcha: strlen() telt ook bytes, en niet per se letters/karakters.

"Gotcha"? Euh ... zijn we een wedstrijdje aan het spelen?

Als je vreemde tekens verwacht, kun je gewoon de multi-byte variant gebruiken.

Dus mb_strlen in plaats van strlen.
Een gotcha is gewoon iets waar je rekening mee moet houden, heeft niets met wedstrijdjes te maken :)
@Ben: oké ... gotcha ;-)

Gotcha klinkt voor mij als 'ik heb je!'. Maar ja, het zal wel turbotaal zijn, moehahahaaa!
Ozzie PHP op 16/04/2018 21:45:14
Als je vreemde tekens verwacht, kun je gewoon de multi-byte variant gebruiken.

Dat is ook niet per se nodig, dit hangt van de character encoding af, en de te verwachten exotische tekens.

Maar de veronderstelling dat strlen() karakters telt, en niet bytes is een misconceptie. Natuurlijk heeft dit een geschiedenis (gebaseerd op traditionele codepages die vrijwel geen exotische karakters hebben, en waar nagenoeg alles in een byte past), en de naam is niet echt optimaal gekozen / toepasselijk meer. En in veel gevallen zal dit werken, maar lang niet alle. Dit is dus een redelijk standaard instinker, en dit omschrijven als gotcha is vaktaal, geen turbotaal.
>> Dat is ook niet per se nodig, dit hangt van de character encoding af, en de te verwachten exotische tekens.

Klopt. Dat is wat ik ook bedoel.

Er zijn overigens meer van dit soort mb-varianten, zo heb je ook bijvoorbeeld mb_strpos.

Gotcha ... raar woord voor een instinker, maar ik zal het onthouden :-)
Of toch maar weer die regex :-) (nu met "u" modifier)
<?php

$woord = 'appël';
$array = ['l','b','p','s','p'];
print(preg_replace('/[^' . implode($array) . ']/u','_',$woord)); //_pp_l

?>

Reageren