[PHP] Variable in do ... while loop gebruiken als conditie

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Nexz
  • Registratie: Mei 2007
  • Laatst online: 15:08
Goedemorgen mede Tweakers!

Ik heb volgende stukje script:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
$AantalQuo = 0;
            
            $restString = $query;
        
            do {
            
                // We delen de query op.
                $queryQuoArray = explode('"', $restString);
            
                $queryQuoResult[$AantalQuo] = $queryQuoArray[0];
                $AantalQuo++;
                $queryQuoResult[$AantalQuo] = $queryQuoArray[1];
                $AantalQuo++;
                
                $restString = "";
                
                for ($restStringTogether = 2; $restStringTogether <= count($queryQuoResult); $restStringTogether++) {
                
                    if ($restStringTogether == count($queryQuoResult)) {
                    
                        $restString .= $queryQuoArray[$restStringTogether].'"';
                    
                    } else {
                    
                        $restString .= $queryQuoArray[$restStringTogether];
                    
                    }
                
                }
                
                $this->checkVariable = count(explode('"', $restString));
            
            } while ($this->checkVariable > 1);


Zoals jullie zien, wil ik graag d.m.v. een waarde die ik in de do...while loop bepaal een while loop uitvoeren.

Het gaat om een functie die bepaalde invoer op aanhalingstekens parsed, en deze vervolgens als groepjes bij elkaar zet.

Dus ik zet als invoer neer:
hallo "dit is een" test

Ik wil graag als output krijgen:
array("hallo ", "dit is een", " test");

Echter, de while loop loopt keihard vast! Heeft iemand enig idee hoe ik dit op kan lossen? Of een alternatief?

Alvast bedankt!

[ Voor 8% gewijzigd door Nexz op 11-05-2009 12:05 . Reden: Code verbeterd (domme foutjes!) ]


Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 20:51

Haan

dotnetter

Weet je zeker dat $restString kleiner dan 1 wordt? (ik weet niet precies wat de .= operator doet..)
Heb je met een debugger door de code gelopen om te zien wat er precies gebeurt?

@ .= is string concatenation dus

[ Voor 9% gewijzigd door Haan op 11-05-2009 12:10 ]

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • Nexz
  • Registratie: Mei 2007
  • Laatst online: 15:08
@Haan

$restString .= "nogwattekst"
betekent in principe
$restString = $restString."nogwattekst";

In ieder geval, nope, heb even geen xdebug tot mijn beschikking :'(

Over het zeker weten dat hij niet kleiner word dan 1:

Als je de volgende code bekijkt:
PHP:
1
$test = explode("testjeexplode", "hallo");


Dan zou test het volgende geven als output (uit mijn hoofd! please correct me if im wrong!)
array("hallo", "");

[ Voor 44% gewijzigd door Nexz op 11-05-2009 12:09 ]


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Nexz schreef op maandag 11 mei 2009 @ 11:58:
Echter, de while loop loopt keihard vast! Heeft iemand enig idee hoe ik dit op kan lossen? Of een alternatief?
Je zult eerst moeten debuggen op welk punt het precies fout gaat, "Keihard vast lopen" is nogal een vaag begrip.

Wat gaat er niet zoals je verwacht had?

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Ik denk dat je een beetje te moeilijk denkt:
PHP:
1
2
3
4
5
6
7
8
$teststring = 'hallo "dit is een" test';
$exploded = explode('"', $teststring);

foreach ($exploded as $item) {
  $newItems[] = '"' . trim($item) . '"';
}

print_r($newItems);

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Je kan jezelf alvast een hoop moeite besparen als je array_shift gebruikt. ;) Of inderdaad wat CodeCaster hierboven zegt.

Verder: ga inderdaad eens debuggen. "De while loop loopt keihard vast!" zegt niets. ;) Druk waardes af die essentieel zijn voor de werking van je functie, loop de code eens goed na en lees ook Programming FAQ - Debuggen: hoe doe ik dat? eens door. Pinpoint even wát er fout gaat, want dit is een beetje zinloos zo. ;)

[ Voor 4% gewijzigd door NMe op 11-05-2009 12:10 ]

'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!

  • DataGhost
  • Registratie: Augustus 2003
  • Laatst online: 19-09 21:26

DataGhost

iPL dev

Hm, ondertussen heb je de code 'verbeterd'... maar die explode('"', $query) doet niet wat je wilt? De output van die functie is namelijk precies de output die jij wilde, aan de hand van de gegeven invoer dus.

Anyway,
if ($rST == count($qQR)) { $rS .= $whatever .'"'; }
deze conditie is altijd waar in de laatste iteratie van je for-loop dus er zal altijd minimaal één dubbele quote in je string zitten, zodat je variabele op het eind altijd 2 of hoger zal zijn.

[ Voor 9% gewijzigd door DataGhost op 11-05-2009 12:15 ]


Acties:
  • 0 Henk 'm!

  • Nexz
  • Registratie: Mei 2007
  • Laatst online: 15:08
@Woy
Ik weet bijna zeker dat hij vast loopt op het punt dat hij de conditie checkt.

@CodeCaster
Ik heb inderdaad te neiging om snel te complex code te gaan schrijven! Hartstikke bedankt! _/-\o_

* Nexz slaat zichzelf :+

@NMe
Sorry! Ik zal voortaan beter op de regels letten.

@DataGhost
Verrek. explode('"', $restString); doet inderdaad precies wat ik wil.

* Nexz schaamt zich :'(

[ Voor 16% gewijzigd door Nexz op 11-05-2009 12:15 . Reden: extra reactie ]


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Nexz schreef op maandag 11 mei 2009 @ 12:13:
@Woy
Ik weet bijna zeker dat hij vast loopt op het punt dat hij de conditie checkt.
En waarom weet je dat bijna zeker? Het lijkt mij namelijk nogal sterk dat hij vastloopt. Ik kan me nog voorstellen dat de conditie niet de waarde oplevert die jij verwacht, maar dat is heel wat anders dan vastlopen. Met een beetje debuggen kom je daar zo achter.

Je zet bijvoorbeeld gewoon
PHP:
1
2
echo this->checkVariable;
echo (this->checkVariable > 1);

op regel 32 van je voorbeeld, en je weet meteen waar het mis gaat.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Nexz
  • Registratie: Mei 2007
  • Laatst online: 15:08
@Woy

Hij heeft een oneindige loop, omdat de waarde inderdaad niet is wat ik verwachtte. Anyway, het "probleem" is als volgt gefixed:
PHP:
1
$queryQuoResult = explode('"', $removeSlashes);


(Daarom schaam ik me ook zo! :+)

Nu ga ik even pauze houden, eet smakelijk iedereen!

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Nexz schreef op maandag 11 mei 2009 @ 12:22:
@Woy

Hij heeft een oneindige loop, omdat de waarde inderdaad niet is wat ik verwachtte. Anyway, het "probleem" is als volgt gefixed:
PHP:
1
$queryQuoResult = explode('"', $removeSlashes);


(Daarom schaam ik me ook zo! :+)

Nu ga ik even pauze houden, eet smakelijk iedereen!
Dat was dus ook de reden dat je in dit topic er al meerdere keren op gewezen word dat je eerst had moeten debuggen ;)

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Pagina: 1