[PHP] Loop wil niet werken

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Sequence
  • Registratie: Maart 2000
  • Laatst online: 27-05-2024

Sequence

Online marketing

Topicstarter
Hallo mensen, ik heb onderstaand stuk code en dat vervangt 1234 in elke url door 4321.

Wat ik echter graag wil is dat ie dat niet voor elke regel doet, maar om de 3 regels (elke 4e regel dient gedeeltelijk te worden vervangen).
code:
1
2
3
4
5
6
7
8
9
10
11
12
for ($product["buy_url"];;)
                        {
            $find   = "1234";           // string to search
            $new    = "4321";   // string to replace
            
            $product_url = $product["buy_url"];
                $product_url = str_replace($find,$new,$product_url);

            $product["buy_url"]= ($product_url);

                  return $product["buy_url"];
            }


Daarom heb ik in deze tweede poging een loopje rondom het str_replace geplaatst, maar nu krijg ik foutmeldingen, volgens mij wordt het array niet meer gevuld oid, maar ik kom er in ieder geval niet uit.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
for ($product["buy_url"];;)
                        {
            $find   = "1234";           // string to search
            $new    = "4321";   // string to replace
            
            $product_url = $product["buy_url"];
            $i == 0;
            foreach ($product_url as $url)
                {
                $i++;
                if ($i == 3) {
                        $url = str_replace($find,$new,$url);
                                    $i == 0;
                        }
                else
                        {
                        $url = str_replace($find,$find,$url);
                        }
                }   

            $product["buy_url"]= ($product_url);

                  return $product["buy_url"];
            }


Wie weet wat ik verkeerd doe? Hoe zorg ik dat niet elke regel wordt vervangen maar enkel om de X regels (liefst x=3 :P). Alvast bedankt!

Acties:
  • 0 Henk 'm!

  • Scott
  • Registratie: December 2004
  • Laatst online: 20-09 21:57

Scott

Ik ben, dus ik tweak

Op regel 7 gebruik je een vergelijkingsoperator en niet een toekenningsoperator (== ipv =). Waarschijnlijk lost dat het probleem op. Daarnaast is dit stuk vrij overbodig:

PHP:
1
2
3
4
5
else
                        {
                        $url = str_replace($find,$find,$url);
                        }
                }


Ik zou het uiteindelijk zo doen:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php

$find   = "1234";           // string to search
$new    = "4321";   // string to replace
            
$product_url = $product["buy_url"];
$i = 1;
foreach ($product_url as $url) {
         
if ($i == 3) {
    
    $url = str_replace($find,$new,$url);
    $i = 1;
}

$product["buy_url"]= ($product_url);

return $product["buy_url"];
?>

Acties:
  • 0 Henk 'm!

  • Leedbek
  • Registratie: November 2004
  • Laatst online: 12:44

Leedbek

Luuk Luchtloper

Je kunt beter de modulo operator % gebruiken. Dus:

PHP:
1
2
3
4
5
$i = 1;
if ($i % 3 == 0) {
  //hier je code die elke 3x voor moet komen
}
$i++;


En die foutmeldingen worden idd waarschijnlijk veroorzaakt door gebruik van == ipv = in regel 7 en 13.

Klaar voor de steroorlogen?


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Gebruik op got [php][/php] tags zodat je php syntax highlighting krijgt, kies een indenting style en hou je daar aan en een if mag ook zonder else (je hoeft niet te dreigen ;) ) Lees eerst een PHP tutorial (of een generieke tut), want zoals je nu stunt met variabelen en loopjes kan je eerlijk gezegd niets bereiken. Je wijzigt nu in een wazige loop elke keer de variabele $url, maar uiteindelijk doe je niets met die variabele. ;)

{signature}


Acties:
  • 0 Henk 'm!

  • Japius
  • Registratie: April 2003
  • Laatst online: 30-08 20:57
Of je gebruikt de continue:

PHP:
1
2
3
4
5
<?php
for($i=0;$i<20;$i++){
        if($i%3 == 0)continue;
        echo $i."<br />";
}


output:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
1
2
4
5
7
8
10
11
13
14
16
17
19

Acties:
  • 0 Henk 'm!

  • Sequence
  • Registratie: Maart 2000
  • Laatst online: 27-05-2024

Sequence

Online marketing

Topicstarter
Thanks voor de eerste tips, inderdaad werd de uitkomst niet weer terug in het array geplaatst. Dit heb ik nu aangepast in regel 14.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$find   = "1234";   // string to search
$new    = "4321";   // string to replace

$product_url = $product["buy_url"];
$i = 1;
foreach ($product_url as $url) {
    $i++;

    if ($i == 3) {
        $url = str_replace($find,$new,$url);
        $i = 1;
        }

    $product["buy_url"]= ($url);
    return $product["buy_url"];
    }


Ook als ik regel 4 vervang door $product_url = array ($product["buy_url"]); dan werkt het niet. De foreach ziet $product_url als 1 object die in 1 keer wordt verwerkt (lees: alle regels worden aangepast).

Acties:
  • 0 Henk 'm!

  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

Ten eerste wordt bij een foreach niet zozeer volgorde gegarandeerd, dat je daar dus ook even rekening mee houdt. Dat is namelijk afhankelijk van de implementatie van de iterator van de collectie waar je overheen itereert. Daarbij moet je ook goed opletten op dingen aanpassen waar je overheen itereert aangezien je daarmee het iteratie proces mee verstoort (je zou normaliter hier b.v. bij java een concurrent modification exception kunnen krijgen).

Om met zulke lus problemen overweg te gaan kun je lusinvarianten gebruiken om te kijken wat er nou gebeurd. In jouw geval zal bij regel 6 voor de eerste keer, i = 1 gelden; bij regel 7 echter i = 2 voor de eerste keer. Voor de tweede keer geldt bij regel 7 oppeens echter i = 3, en zal de replace plaatsvinden in regel 9 t/m 12, terwijl je pas wilde dat dit bij de 4e iteratie plaats zou vinden. Hier zul je dus ten eerste beter naar moeten kijken. Probeer ten eerste dit dus goed te begrijpen en in te zien.

[ Voor 25% gewijzigd door prototype op 10-10-2007 09:42 ]


Acties:
  • 0 Henk 'm!

  • BKJ
  • Registratie: April 2000
  • Laatst online: 18-09 14:52

BKJ

Definitie 'return':
If called from within a function, the return() statement immediately ends execution of the current function, and returns its argument as the value of the function call. return() will also end the execution of an eval() statement or script file.

If called from the global scope, then execution of the current script file is ended.
Ik vraag me dus af of "return" zo geschikt is om iets te printen....

Kamer huren


Acties:
  • 0 Henk 'm!

Verwijderd

Japius schreef op dinsdag 09 oktober 2007 @ 22:15:
Of je gebruikt de continue:
PHP:
1
2
3
4
5
<?php
for($i=0;$i<20;$i++){
        if($i%3 == 0)continue;
        echo $i."<br />";
}
Of niet ;)
PHP:
1
2
3
4
<?php
for($i=0;$i<20;$i++){
        if($i%3 != 0) echo $i."<br />";
}

Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Voutloos schreef op dinsdag 09 oktober 2007 @ 20:52:
Gebruik op got [php][/php] tags zodat je php syntax highlighting krijgt, kies een indenting style en hou je daar aan en een if mag ook zonder else (je hoeft niet te dreigen ;) ) Lees eerst een PHP tutorial (of een generieke tut), want zoals je nu stunt met variabelen en loopjes kan je eerlijk gezegd niets bereiken. Je wijzigt nu in een wazige loop elke keer de variabele $url, maar uiteindelijk doe je niets met die variabele. ;)
Ik heb verder weinig nuttigs toe te voegen maar wil dit even benadrukken. De creatieve for-loops in de topicstart doen mij nogal geloven dat de topicstarter niet echt weet wat hij aan het doen is, en dat lijkt me niet handig. Lees je eerst in voordat je ergens aan begint, dat scheelt een hoop kopzorgen. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • Crayne
  • Registratie: Januari 2002
  • Laatst online: 17-03 13:41

Crayne

Have face, will travel

Ik vraag me af of $product["buy_url"] ook echt een array is, maar goed. Als dat zo is heb je hier denk ik meer aan:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function replaceIt(&$arrInput)
{

    foreach ($arrInput as $intKey => $strValue)
    { 

        if (($intKey + 1) % 4 == 0)
        {
            
            $arrInput[$intKey] = str_replace("1234", "4321", $arrInput[$intKey]);
            
        }

    }

}


Aan te roepen met

PHP:
1
replaceIt($product["buy_url"]);


Als je vervolgens een array aanmaakt met bijvoorbeeld 12x "1234" en die door deze functie haalt, zul je zien dat elementen 3, 7 en 11 zijn vervangen door "4321".

[ Voor 34% gewijzigd door Crayne op 10-10-2007 13:54 ]

Mijn Library Thing catalogus

Pagina: 1