/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
str_replace og foreach
Fra : Lasse Jensen


Dato : 28-05-08 21:48

X Hey guys :)

Er der nogen simpel forklaring på, hvorfor min str_replace ikke
virker inde i min løkke, men virker fint udenfor den?

Hvad kan man så gøre i stedet?

preg_match_all('/<span style="color:(.*?);">(.*?)<\/span>/si',
$description, $colorIsolator);

foreach($colorIsolator[1] AS $match) {

$hexa++;
$color++;

$hexa = $match;

$description = str_replace('<span style=\"color:', '<span
class="' . $color . '" style="color:', $description);

}

Skal jeg benytte en while istedet måske?

På forhånd tak.

Mvh. Lasse Jensen

--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

 
 
Bertel Lund Hansen (28-05-2008)
Kommentar
Fra : Bertel Lund Hansen


Dato : 28-05-08 23:35

Lasse Jensen skrev:

> Er der nogen simpel forklaring på, hvorfor min str_replace ikke
> virker inde i min løkke, men virker fint udenfor den?

Ja. Når man bruger foreach (), arbejder man med en kopi, og
originalen er uberørt af alle ens smarte rutiner.

Løsningen er enten at lave en for-løkke eller at sætte en
nummerering på således:

foreach ($mysterydata as $nr => $entity) {
   if (is_interesting($entity))
      do_something_smart_with($mysterydata[$nr]);
}

Bemærk at der testes på kopien $entity, men man bearbejder
originalen.

--
Bertel
http://bertel.lundhansen.dk/      FIDUSO: http://fiduso.dk/

Peter Brodersen (29-05-2008)
Kommentar
Fra : Peter Brodersen


Dato : 29-05-08 03:11

On Thu, 29 May 2008 00:34:35 +0200, Bertel Lund Hansen
<unospamo@lundhansen.dk> wrote:

>Ja. Når man bruger foreach (), arbejder man med en kopi, og
>originalen er uberørt af alle ens smarte rutiner.
>
>Løsningen er enten at lave en for-løkke eller at sætte en
>nummerering på således:

Man kan også bruge referencer i foreach. Det er nok op til en selv, om det
gør tingene mere overskuelige. Men fx:

foreach ($mysterydata as &$entity) {
....


--
- Peter Brodersen
Kendt fra Internet

Bertel Lund Hansen (29-05-2008)
Kommentar
Fra : Bertel Lund Hansen


Dato : 29-05-08 07:12

Peter Brodersen skrev:

> Man kan også bruge referencer i foreach.

Tak for tippet. Det er jo logisk nok.

--
Bertel
http://bertel.lundhansen.dk/      FIDUSO: http://fiduso.dk/

Lasse Jensen (31-05-2008)
Kommentar
Fra : Lasse Jensen


Dato : 31-05-08 12:04

Bertel Lund Hansen wrote in
>
> foreach ($mysterydata as $nr => $entity) {
>    if (is_interesting($entity))
>       do_something_smart_with($mysterydata[$nr]);
> }
>
> Bemærk at der testes på kopien $entity, men man bearbejder
> originalen.

Lyder umiddelbart meget smart, men jeg er stadig lidt i tvivl om
hvordan den helt fungerer. Jeg kan ikke få det helt til at virke
ihvertfald.

preg_match_all('/<span style="color:(.*?);">(.*?)<\/span>/si',
$description, $colorIsolator);

foreach($colorIsolator[1] AS $description => $match) {

$hexa++;
$color++;
$hexa = $match;

$description = str_replace('<span style=\"color:', '<span class="' .
$color . '" style="color:', $description);

}

På forhånd tak :)

Mvh. Lasse Jensen

--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

Bertel Lund Hansen (31-05-2008)
Kommentar
Fra : Bertel Lund Hansen


Dato : 31-05-08 12:18

Lasse Jensen skrev:

> Lyder umiddelbart meget smart, men jeg er stadig lidt i tvivl om
> hvordan den helt fungerer. Jeg kan ikke få det helt til at virke
> ihvertfald.

Det er lidt snørklet kode du har lavet. Nu er jeg ikke god til
regulære udtryk, men jeg kan da læse manualen.

> preg_match_all('/<span style="color:(.*?);">(.*?)<\/span>/si',
> $description, $colorIsolator);

$description er den genstand der skal tjekkes for match.

> foreach($colorIsolator[1] AS $description => $match) {

men pludselig ødelægger du den variabel og bruger den i stedet
som nøgle i en array-løkke.

> $hexa++;
> $color++;
> $hexa = $match;

Så gør du to ting ved $hexa hvor kun den sidste har betydning.

> $description = str_replace('<span style=\"color:', '<span class="' .$color . '" style="color:', $description);

Og så prøver du at ændre nøglens værdi. Hvis det er et
almindeligt array, har $description blot en numerisk værdi.

Prøv at forklare mig hvordan det preg_matchede array ser ud og
hvorfor du udvælger andet led med $colorIsolator[1].

--
Bertel
http://bertel.lundhansen.dk/      FIDUSO: http://fiduso.dk/

Lasse Jensen (31-05-2008)
Kommentar
Fra : Lasse Jensen


Dato : 31-05-08 13:15

Bertel Lund Hansen wrote in dk.edb.internet.webdesign.serverside.php:
>
> Det er lidt snørklet kode du har lavet. Nu er jeg ikke god til
> regulære udtryk, men jeg kan da læse manualen.
>
> > preg_match_all('/<span style="color:(.*?);">(.*?)<\/span>/si',
> > $description, $colorIsolator);

Mit regex gør bare det at den finder en string i $description og lister resultaterne af det fundne objekter i et
array. Der ligger flere "arrays i array'et". I regex står der .*? 2 steder, hvilket betyder den kan være forskellig
den værdi. Selve den værdi bliver smidt i et array. Dem er der som sagt 2 af, så vi har 2 at vælge imellem der. Og
man kan vælge at få hele linien ud hvis man vil det. Jeg vælger hos mig colorIsolator[1]. [1] svarer i dette
tilfælde til den første, som er en hexadecimal, hvilket det hele handler om at jeg skal bruge for at generere noget
CSS.

>
> > foreach($colorIsolator[1] AS $description => $match) {
>
> men pludselig ødelægger du den variabel og bruger den i stedet
> som nøgle i en array-løkke.
>
> > $hexa++;
> > $color++;
> > $hexa = $match;
>
> Så gør du to ting ved $hexa hvor kun den sidste har betydning.

Det den skal gøre er at den skal tælle hvor mange fundne objekter Regex'et fandt.
Variablen skal hedde $hexa1, $hexa2 og så videre, så jeg får arrayet printet ud i nummerisk orden.
Deraf $hexa++. Det samme gælder med $color. Til sidst tildeler jeg så $hexa værdien.

I princippet burde det nok være mere rigtigt (smartere) at skrive $hexa++ = $match;

>
> > $description = str_replace('<span style=\"color:', '<span class="' .$color . '" style="color:', $description);
>
> Og så prøver du at ændre nøglens værdi. Hvis det er et
> almindeligt array, har $description blot en numerisk værdi.

Når den har talt op, skal den ændre alle matchene strings i $description til noget andet. Denne kunne i princippet
også køres før min foreach. Så skulle regex'et bare tilpasset den nye string i stedet.

Måske i virkeligheden nemmere, eftersom det er det som driller.
Kunne bare godt tænke mig at vide som sagt hvorfor det ikke virkede som jeg havde gjort nu.

Mvh. Lasse Jensen

--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

Lasse Jensen (31-05-2008)
Kommentar
Fra : Lasse Jensen


Dato : 31-05-08 13:20

Bertel Lund Hansen wrote in dk.edb.internet.webdesign.serverside.php:
>
> Prøv at forklare mig hvordan det preg_matchede array ser ud og
> hvorfor du udvælger andet led med $colorIsolator[1].
>

Bertel, her er lige et eksempel på hvordan array'et ville se ud:

array(3) {
[0]=>
array(1) {
[0]=>
string(45) "<span style="color: #ff0000;">sxsxsxsx</span>"
}
[1]=>
array(1) {
[0]=>
string(7) "#ff0000"
}
[2]=>
array(1) {
[0]=>
string(8) "sxsxsxsx"
}
}

Mvh. Lasse Jensen

--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

Bertel Lund Hansen (31-05-2008)
Kommentar
Fra : Bertel Lund Hansen


Dato : 31-05-08 14:25

Lasse Jensen skrev:

> Bertel, her er lige et eksempel på hvordan array'et ville se ud:

> array(3) {
> [0]=>
> array(1) {
> [0]=>
> string(45) "<span style="color: #ff0000;">sxsxsxsx</span>"
> }
> [1]=>
> array(1) {
> [0]=>
> string(7) "#ff0000"
> }
> [2]=>
> array(1) {
> [0]=>
> string(8) "sxsxsxsx"
> }
> }

Hvorfor laver du det ikke sådan:

array(3) {
   "<span style="color: #ff0000;">sxsxsxsx</span>"
   "#ff0000"
   "sxsxsxsx"
}

Når du foreacher $colorIsolator[1], så får du kun gennemløbet
ét array, nemlig det første underarray i $colorIsolator.

Hvis du absolut vil beholde din struktur uændret, skal du skrive:

   for ($nr=0; $nr<count($colorIsolator); ++$nr)
      $colorIsolator[$nr][0] = str_replace('<span style=\"color:', '<span class="' .$color . '" style="color:',$colorIsolator[$nr][0]);

Du er nødt til at bruge nummerering og ikke foreach fordi du
ellers blot ændrer en kopi.

Hvis du kan bruge det forenklede array, ser gennemløbet sådan ud:
   for ($nr=0; $nr<count($colorIsolator); ++$nr)
      $colorIsolator[$nr] = str_replace('<span style=\"color:', '<span class="' .$color . '" style="color:',$colorIsolator[$nr]);


At få styret rækkefølgen ved at lave variable med løkkestyrede
numre er noget uoverskueligt fusk. Kan du ikke bare skrive ud
med det samme inden i løkken?


Du kan ikke bruge $hexa som du gør. Lad os sige at den efter et
gennemløb har værdien "<span style="color: #ff0000;">sxsxsxsx</span>".

$hexa++; vil så bevirke at heltalsværdien beregnes (den er 0) og forøges,
så bagefter har $hexa værdien 1. To linjer længere nede får den så tildelt
værdien "#ff0000". Det giver ingen mening.

--
Bertel
http://bertel.lundhansen.dk/      FIDUSO: http://fiduso.dk/

Lasse Jensen (31-05-2008)
Kommentar
Fra : Lasse Jensen


Dato : 31-05-08 16:28

Bertel Lund Hansen wrote in dk.edb.internet.webdesign.serverside.php:
>
> Hvorfor laver du det ikke sådan:
>
> array(3) {
>    "<span style="color: #ff0000;">sxsxsxsx</span>"
>    "#ff0000"
>    "sxsxsxsx"
> }

Preg_match_all genererer automatisk det andet array som jeg postede.

>
> Når du foreacher $colorIsolator[1], så får du kun gennemløbet
> ét array, nemlig det første underarray i $colorIsolator.

Præcis, ligesom er meningen, så jeg kun får fat i #ff0000; fx :)

>
> Hvis du absolut vil beholde din struktur uændret, skal du skrive:
>
>    for ($nr=0; $nr<count($colorIsolator); ++$nr)
>       $colorIsolator[$nr][0] = str_replace('<span style=\"color:', '<span class="' .$color . '" style="color:',$colorIsolator[$nr][0]);
>

Hov det går ikke helt her tror jeg. Sådan som jeg ser det så kommer $nr til at indeholde tal nu.
Jeg skal stadig bruge værdien i arrayet. Altså:

$nr1 = #ff0000;
$nr2 = #000000; etc ..

Udover det kan jeg ikke bruge str_replace på variablen $colorIsolator.
Det skal være på variablen $description den skifter stringen ud.

Mvh. Lasse Jensen

--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

Bertel Lund Hansen (31-05-2008)
Kommentar
Fra : Bertel Lund Hansen


Dato : 31-05-08 17:00

Lasse Jensen skrev:

> > Når du foreacher $colorIsolator[1], så får du kun gennemløbet
> > ét array, nemlig det første underarray i $colorIsolator.

> Præcis, ligesom er meningen, så jeg kun får fat i #ff0000; fx :)

Det er den eneste du får fat i.

> Hov det går ikke helt her tror jeg. Sådan som jeg ser det så kommer $nr til at indeholde tal nu.

Ja. Før var det $descriptor der indeholdt tal. Du arbejder på
nøglen, hvilket er tilladt, men lidt bagvendt.

> Jeg skal stadig bruge værdien i arrayet. Altså:

> $nr1 = #ff0000;
> $nr2 = #000000; etc ..

Ikke på den måde. $nr skal holde styr på hvilket element du
tilgår. Værdien finder du i $colorIsolator[$nr][0].

> Udover det kan jeg ikke bruge str_replace på variablen $colorIsolator.
> Det skal være på variablen $description den skifter stringen ud.

$description er blevet ødelagt da den blev overskrevet med en
numerisk værdi. Foreach virker således:

$array1 = ('a','g','y','e','l');
foreach ($array1 as $description => $match) ...
1.    $description==0, $match=='a'
2.    $description==1, $match=='g'
3.    $description==2, $match=='y'
4.    $description==3, $match=='e'
5.    $description==4, $match=='l'

--
Bertel
http://bertel.lundhansen.dk/      FIDUSO: http://fiduso.dk/

Lasse Jensen (31-05-2008)
Kommentar
Fra : Lasse Jensen


Dato : 31-05-08 19:39

Bertel Lund Hansen wrote in dk.edb.internet.webdesign.serverside.php:
>
> > Hov det går ikke helt her tror jeg. Sådan som jeg ser det så kommer $nr til at indeholde tal nu.
>
> Ja. Før var det $descriptor der indeholdt tal. Du arbejder på
> nøglen, hvilket er tilladt, men lidt bagvendt.

Nej nej, $description har aldrig indeholdt tal. Hvor ser du det henne? $description er ikke et array,
det er bare en variabel indeholdende en hel sides kode. (Så jeg kan få vist siden via variablen et
andet sted henne).

>
> > Jeg skal stadig bruge værdien i arrayet. Altså:
>
> > $nr1 = #ff0000;
> > $nr2 = #000000; etc ..
>
> Ikke på den måde. $nr skal holde styr på hvilket element du
> tilgår. Værdien finder du i $colorIsolator[$nr][0].

Det er vel også fint nok. Om variablen hedder $hexa eller $colorIsolator er ligemeget.
Den bruges bare til at "skaffe en værdi" som kan tælles. Om den lagrer samme sted værdien er så
samtidig også fint nok. Kan bare ikke se hvor henne du sætter $colorIsolator = #ff0000; fx?
>
>
> $description er blevet ødelagt da den blev overskrevet med en
> numerisk værdi. Foreach virker således:
>
> $array1 = ('a','g','y','e','l');
> foreach ($array1 as $description => $match) ...
> 1.    $description==0, $match=='a'
> 2.    $description==1, $match=='g'
> 3.    $description==2, $match=='y'
> 4.    $description==3, $match=='e'
> 5.    $description==4, $match=='l'
>
Str_replacen skal køres på $description! Man får intet ud af at køre den på $colorIsolator.
Brugeren får vist $description. Det er hovedvariablen med alt kode der skal vises.

I såfald skal kodestykket ovenover se anderledes ud. $description skal bibeholde samme værdi, det
eneste der skal ske med den er at str_place skal udføres på den.

Mvh. Lasse Jensen

--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

Bertel Lund Hansen (31-05-2008)
Kommentar
Fra : Bertel Lund Hansen


Dato : 31-05-08 20:37

Lasse Jensen skrev:

> Nej nej, $description har aldrig indeholdt tal. Hvor ser du det henne?

Her:

   foreach($colorIsolator[1] AS $description => $match) {

Der bliver $description sat til at nummerere arrayet
$colorIsolator[1] så vidt jeg kan se. I hvert fald mister den sin
gamle værdi.

Men jeg opgiver at hjælpe dig mere. Det er for teoretisk når jeg
ikke kan afprøve din kode.

--
Bertel
http://bertel.lundhansen.dk/      FIDUSO: http://fiduso.dk/

Lasse Jensen (31-05-2008)
Kommentar
Fra : Lasse Jensen


Dato : 31-05-08 21:03

Bertel Lund Hansen wrote in dk.edb.internet.webdesign.serverside.php:
>
> Men jeg opgiver at hjælpe dig mere. Det er for teoretisk når jeg
> ikke kan afprøve din kode.
>

Det ligger online, så hvis du ville afprøve det i praksis ville det være
muligt. Der er bare ikke så meget at prøve.

www.webweaver.dk/cms
bruger: admin
pass: elektriker

Og så under Newsletter W.

Alt det tekst du skriver i text-feltet er $description. Samtidig genereres
der diverse HTML koder afhængig af hvad du vil. Fonttype, farve og så
videre. Og det laver jeg så bare om til CSS såmænd :) Eller, jeg prøver på
det ;)

Du kan så gå ned og kigge på det postede indlæg du har skrevet derinde og
se nærmere, hvor jeg blandt andet har "printet underarray'et ud" og
hexadecimalen vil fremgå, hvis du prøver at give den skrevne tekst en
tilfældig farve før du poster.

Mvh. Lasse Jensen

--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials

Søg
Reklame
Statistik
Spørgsmål : 177459
Tips : 31964
Nyheder : 719565
Indlæg : 6408186
Brugere : 218881

Månedens bedste
Årets bedste
Sidste års bedste