Avatar billede mazey Praktikant
05. august 2014 - 17:02 Der er 7 kommentarer og
1 løsning

Problem med en lille funktion

Hej eksperter,

Nu er jeg ikke super skarp i PHP funktioner, så jeg kan simpelthen ikke forstå hvorfor følgende ikke kan fungere:

<?
$m_dk_letters = array("Æ","Ø","Å","æ","ø","å", " ", "?", "&", "'", '"', "/", "-");
$m_rep_letters = array("ae","oe","aa","ae","oe","aa", "_", "", "og", "", "", "_", "");

function replacer($maxe){
    $facit = str_replace($m_dk_letters,$m_rep_letters,$maxe);
    return $facit;
    }
echo replacer('æøå');
?>

Jeg ville jo gerne at replacer('æøå') returnerede "aeoeaa".

Kan nogen mon hjælpe?
Avatar billede olsensweb.dk Ekspert
05. august 2014 - 17:17 #1
årsagen er meget enkel: scope
inde i functionen kan de ikke se/tilgå det der er ude for functionen, og omvendt
løsning lig de 2 arrayes ind i functionen

nb: short open tag er slået fra pr default på de fleste servere så lad vare med at bruge det.

utested

<?php
function replacer($maxe){
    $m_dk_letters = array("Æ","Ø","Å","æ","ø","å", " ", "?", "&", "'", '"', "/", "-");
    $m_rep_letters = array("ae","oe","aa","ae","oe","aa", "_", "", "og", "", "", "_", "");

    $facit = str_replace($m_dk_letters,$m_rep_letters,$maxe);
    return $facit;
    }
echo replacer('æøå');
?>


alternativ til str_replace kig på http://php.net/manual/en/function.strtr.php
kig evt på olebole's eks http://www.eksperten.dk/spm/947835 #6
05. august 2014 - 17:20 #2
Scope problem - http://php.net/manual/en/language.variables.scope.php

Du kan enten løse det ved at flytte variablerne:
<?php
function replacer($maxe)
{
    $dk = array("Æ","Ø","Å","æ","ø","å", " ", "?", "&", "'", '"', "/", "-");
    $rep = array("ae","oe","aa","ae","oe","aa", "_", "", "og", "", "", "_", "");
    return str_replace($dk, $rep, $maxe);
}
echo replacer("æøå");
?>


Eller ved at bruge global keywordet:
<?php
$dk  = array("Æ","Ø","Å","æ","ø","å", " ", "?", "&", "'", '"', "/", "-");
$rep = array("ae","oe","aa","ae","oe","aa", "_", "", "og", "", "", "_", "");

function replacer($maxe){
    global $dk, $rep;

    return str_replace($dk, $rep, $maxe);
}
echo replacer("æøå");
?>
Avatar billede olsensweb.dk Ekspert
05. august 2014 - 17:37 #3
brugen af global er jeg meget imod da man er bundet til navnet hvis man bruger variablen andre steder, så hellere overføre det som et parameter

utested

<?php
$m_dk_letters = array("Æ","Ø","Å","æ","ø","å", " ", "?", "&", "'", '"', "/", "-");
$m_rep_letters = array("ae","oe","aa","ae","oe","aa", "_", "", "og", "", "", "_", "");
   
function replacer($maxe, &$dk_letters, &$rep_letters){
    $facit = str_replace($dk_letters,$rep_letters,$maxe);
    return $facit;
}
echo replacer('æøå', $m_dk_letters, $m_rep_letters);
?>

læg mærke til & tegnet i parameteren, hvilke betyder der laves en referance til den externe variabel, istedet for et kopi

kig på denne google
https://www.google.dk/search?q=php+call+by+reference+vs+call+by+value

http://php.net/manual/en/language.references.pass.php
Avatar billede jakobdo Ekspert
05. august 2014 - 22:12 #4
Du kunne også bruge strtr: http://php.net/manual/en/function.strtr.php

Se eksemplet:
$trans = array("h" => "-", "hello" => "hi", "hi" => "hello");
echo strtr("hi all, I said hello", $trans);
Avatar billede mazey Praktikant
05. august 2014 - 22:50 #5
Mange tak for jeres svar - det virkede ved at sætte de 2 arrays ind i funktionen. Nu havde I jo begge ret, så jeg ved ikke om pointene skal deles, eller om den, der kom først skal have eller hvordan?
Avatar billede olsensweb.dk Ekspert
06. august 2014 - 01:02 #6
Nu havde I jo begge ret, så jeg ved ikke om pointene skal deles,
jeg springer point over, har ikke noget at bruge dem til.
( jeg besvare kun spm her på http://www.eksperten.dk når jeg har tid og der ikke sker noget på http://www.udvikleren.dk/ )
vedr. deling af point se http://www.eksperten.dk/faq#faq-3-2 og http://www.eksperten.dk/faq#faq-3-1
de fleste af os ligger kun kommentare, og først et svar når vi bliver bedt om det (hvis vi samler point).

nu når du har besluttet dig for at ligge arrayet ind i functionen, så kan du gøre som nedenstående (direkte afledt af de nederste 2 linjer i #1), hvilke er nemmere at læse og vedligeholde
(utested)

<?php
function replacer($maxe){   
    $arr_repl = array("Æ"=>"ae","Ø"=>"oe","Å"=>"aa","æ"=>"ae","ø"=>"oe","å"=>"aa");
    $facit = strtr($maxe, $arr_repl);   
    return $facit;
}
echo replacer('æøå');
?>


men havde du skulle bruge arrayet til andre ting også, feks i hoved programmet eller andre functioner, havde du skulle overføre det som parameter, enten som call by reference eller call by value, brugen af global i functioner er i mange programmøres øjne (herunder mine) fy, da man er bundet af det globale varriabel navn, og ikke har styr på hvor variablen ændres
Avatar billede mazey Praktikant
15. september 2014 - 19:49 #7
Jeg vil gerne lukke spørgsmålet her - Ronols har sprunget over på point, så vil gerne tildele point til TheBlackKnight. Jeg håber du vil skrive et svar.

På forhånd tak, og endnu en gang tak for hjælpen
Avatar billede mazey Praktikant
14. januar 2015 - 21:53 #8
Da vedkommende ikke har henvendt sig efter point, lukkes spørgsmålet. Gør jeg noget forkert, så skriv.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester