[php] variabelen vergelijken, variabele leeg?

Pagina: 1
Acties:
  • 321 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Dark Blue
  • Registratie: Februari 2001
  • Laatst online: 05-09 10:36

Dark Blue

Compositionista!

Alpenmeisje

Topicstarter
Hoi, ik zit momenteel echt met mijn handen in het haar over het volgende.

Ik wil een simpel aanpasbare planning uitwerken in html en php. ik heb de 'al aanwezige' bruikbare code opgesnord maar juist omdat ik weer moeilijk moet doen, gaat het mis. Zie hier:

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
function createplanning()
{
$text = readtext('planning.inc.php'); // stop de tekst uit 'planning.inc.php' in $text;
if (!empty($text))
{
    $text = explode("\n", $text);
    $i = 0;
    while ($i < sizeof($text))
    {
        $itemarray = explode( '|', $text[$i]);
        echo ("<b>".$itemarray[2]."</b>");
        echo ($maand);
        if ( $maand == $itemarray[2] )
        {
            $textitem = str_replace("<br>", "<br>\r\n", $itemarray[0]);
            $formcontents.= "<div class='msgtop' id='wit' style='font-weight: bold;'>".$itemarray[1].", ".$itemarray[2]."</div><div class='msgmid'>".$textitem."</div><div class='msgbot'></div><br>"; 
            $i++;
        }
        else
        {
            $i++;
        }
    }
}

(overigens hoort hier nog een stukje else... onder voor het geval $text leeg was. niet relevant).

Het gaat om specifiek het volgende stukje:
(de twee echo's voor $itemarray[2] en $maand heb ik ter test erin gezet)
PHP:
1
2
3
4
5
6
7
8
        echo ("<b>".$itemarray[2]."</b>");
        echo ($maand);
        if ( $maand == $itemarray[2] )
        {
            $textitem = str_replace("<br>", "<br>\r\n", $itemarray[0]);
            $formcontents.= "(meuk zoals boven)"; 
            $i++;
        }

Ik heb even een proeffile 'planning.inc.php' aangemaakt en daarin is $itemarray[2] dus telkens de naam van de maand (januari, februari, maart...). Nu wil ik dat per keer dat ik de functie aanroep, ik alléén de gegevens van één maand terugkrijg. Dus zo roep ik hem aan:
PHP:
1
<div><? $maand = 'maart'; createplanning(); ?></div>

Het staat precies zo achter elkaar; er komt niks tussen. Echter, in mijn echo's hierboven ^^ geeft de echo voor $itemarray[2] netjes de maand uit die array weer, maar $maand is op dat moment léég. terwijl ik net heb gezegd dat $maand 'maart' moet zijn :?

Ik zal wel iets verkeerd doen met soorten variabelen ofzo, ... kijk als het nou was dat hij ze niet vergeleek omdat ze niet van gelijke soort / inhoud waren, oké. maar heel die $maand is gewoon leeg zodra ik bij het vergelijken aankom?

overigens zijn suggesties om het compleet anders en korter te doen zeer welkom, ik code alleen maar wat ik weet en wat ik logisch vind, maar de slimme trucs, afkortingen enzo... geen kaas van gegeten.
(Papa Eend zal de code ook wel herkennen, uche)

(dit is geen serieus project, de wereld zal er niet op achteruit gaan :P )

Bedankt voor de hulp! :)

[ Voor 25% gewijzigd door Dark Blue op 12-03-2005 05:44 ]

heidiulrich.nl | adventura.nl : rugzakavonturen | pathwise.nl : prepping geeks to get jobs


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Als je variabelen door wil geven tussen het ene stuk programma (je functieaanroep) en een ander stuk programma (je functie), dan zul je dat met parameters van functies moeten doen, of met global variabelen, waar het eerstgenoemde de voorkeur geniet.

Maak je functiedefinitie in plaats van dit:
PHP:
1
function createplanning()

dit:
PHP:
1
function createplanning($maand)

en roep het daarna aan met:
PHP:
1
<div><? createplanning('maart'); ?></div>

Waarschijnlijk doet dat al heel wat meer. ;)

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

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Je probeert nu een globale variabel lokaal in de functie te gebruiken. Je kunt dit oplossen volgens de manier van -NMe- (de nette manier) of je kunt voordat je de variabel in de functie gebruikt hem globaal declareren:
PHP:
1
2
3
4
5
6
7
function createplanning()
{
  global $maand;
  // ...
  echo ($maand);
  // ...
}

of je kunt hem direct bereiken door de superglobals array $GLOBALS te gebruiken. Hierin staan alle globale variabelen waarvan de naam van de variabel gelijk is aan de index in deze array:
PHP:
1
2
3
4
5
6
function createplanning()
{
  // ...
  echo ($GLOBALS['maand']);
  // ...
}

En dit noemen we dan maar de smerige manier. Probeer dit altijd te vermijden, ga altijd voor de parameter oplossing. Eventueel kun je de parameter ook als reference doorgeven zodat je hem nog een andere waarde kunt geven mocht dat nodig zijn.

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • Dark Blue
  • Registratie: Februari 2001
  • Laatst online: 05-09 10:36

Dark Blue

Compositionista!

Alpenmeisje

Topicstarter
Die tweede manier kwam ik gisternacht nog op, en die eerste manier van NMe is me vanochtend uitgelegd :P Even proberen.
Ik wist ergens in mn achterhoofd al dat het een dergelijke insteek moest hebben maar de vorige keer dat ik probeerd wat tussen de haakjes van die functie te zetten gaf ie een fout :X ... dusch ff verder kijken dan mijn neus lang is.

Edit: ik heb de methode van NMe gebruikt en hij doet het, hij doet het, hij doet het!!!

Als iemand zich nog verveelt en in bovenstaand stuk code dingen ziet waarvan ie denkt 'jezes dat kan toch korter' please enlighten me, al die echo's zijn er nu uit hoor :P maar gewoon, dat stukje 'else... $i++' vind ik ook überlelijk maar ik geloof dat het gewoon zo moet.

Dank jullie :D ... t antwoord lag voor het oprapen maar toch :D

[ Voor 39% gewijzigd door Dark Blue op 12-03-2005 13:13 ]

heidiulrich.nl | adventura.nl : rugzakavonturen | pathwise.nl : prepping geeks to get jobs


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Dark Blue schreef op zaterdag 12 maart 2005 @ 12:58:
Als iemand zich nog verveelt en in bovenstaand stuk code dingen ziet waarvan ie denkt 'jezes dat kan toch korter' please enlighten me, al die echo's zijn er nu uit hoor :P maar gewoon, dat stukje 'else... $i++' vind ik ook überlelijk maar ik geloof dat het gewoon zo moet.

Dank jullie :D ... t antwoord lag voor het oprapen maar toch :D
Je vraagt er om >:)
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php

function createplanning($maand)
{
    $textLines = explode("\n", readtext('planning.inc.php'));
    
    foreach ( $textLines as $line )
    {
        $itemArray = explode('|', $line);
        
        echo "<b>" . $itemArray[2] . "</b>" . $maand;
        
        if ( $maand != $itemArray[2] ) continue;
        
        $formcontents .= '<div class="msgtop" id="wit" style="font-weight: bold;">' .
            $itemArray[1] . ', ' . $itemArray[2] .
            '</div><div class="msgmid">' .
            str_replace("<br>", "<br>\r\n", $itemArray[0]) .
            '</div><div class="msgbot"></div><br>';
    }
}

?>

Ik snap alleen niet wat je nou met $formcontents wilt gaan doen, want op deze manier gebeurt er vrij weinig namelijk :)

edit:

$i geheel uitgeschakeld met een foreach lus

[ Voor 40% gewijzigd door Michali op 12-03-2005 13:41 ]

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • NetForce1
  • Registratie: November 2001
  • Laatst online: 20-09 23:15

NetForce1

(inspiratie == 0) -> true

Dark Blue schreef op zaterdag 12 maart 2005 @ 12:58:

Als iemand zich nog verveelt en in bovenstaand stuk code dingen ziet waarvan ie denkt 'jezes dat kan toch korter' please enlighten me, al die echo's zijn er nu uit hoor :P maar gewoon, dat stukje 'else... $i++' vind ik ook überlelijk maar ik geloof dat het gewoon zo moet.

Dank jullie :D ... t antwoord lag voor het oprapen maar toch :D
Mijn oog viel idd op dat stukje, dat kan zo beter:
PHP:
1
2
3
4
5
6
        if ( $maand == $itemarray[2] )
        {
            $textitem = str_replace("<br>", "<br>\r\n", $itemarray[0]);
            $formcontents.= "<div class='msgtop' id='wit' style='font-weight: bold;'>".$itemarray[1].", ".$itemarray[2]."</div><div class='msgmid'>".$textitem."</div><div class='msgbot'></div><br>"; 
        }
        $i++;

$i++ wordt nl altijd uitgevoerd, dus dan kan ie beter uit de if-else

edit: Zie Michali dus

[ Voor 15% gewijzigd door NetForce1 op 12-03-2005 13:40 . Reden: /me is traag, en onvolledig :( ]

De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"


Acties:
  • 0 Henk 'm!

  • Dark Blue
  • Registratie: Februari 2001
  • Laatst online: 05-09 10:36

Dark Blue

Compositionista!

Alpenmeisje

Topicstarter
Michali schreef op zaterdag 12 maart 2005 @ 13:32:
[...]

Je vraagt er om >:)
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php

function createplanning($maand)
{
    $textLines = explode("\n", readtext('planning.inc.php'));
    
    for ( $i = 0; $i < count($textLines); $i++ )
    {
        $itemArray = explode('|', $textLines[$i]);
        
        echo "<b>" . $itemArray[2] . "</b>" . $maand;
        
        if ( $maand != $itemArray[2] ) continue;
        
        $formcontents .= '<div class="msgtop" id="wit" style="font-weight: bold;">' .
            $itemArray[1] . ', ' . $itemArray[2] .
            '</div><div class="msgmid">' .
            str_replace("<br>", "<br>\r\n", $itemArray[0]) .
            '</div><div class="msgbot"></div><br>';
    }
}

?>

Ik snap alleen niet wat je nou met $formcontents wilt gaan doen, want op deze manier gebeurt er vrij weinig namelijk :)
Holy Moses, is dat de hele functie! :P Mijn dank is supergroot zeg, ... ik zal hem straks even doorlezen, als ik hem snap gebruik ik hem want hoe korter hoe beter natuurlijk. _O_

Zoals ik in mn TS al zei zijn dit bij elkaar gesprokkelde stukken code, het is ooit een bijna werkende CMS geweest waarin je dus ook kon editten (kan nu nog wel maar niet meer zo complex) en daarvoor zal $formcontents wel in het leven geroepen zijn. Ik zou even moeten uitvinden of ik hem verder nog gebruik anders kan ik die er ook uitslopen...
NetForce1 schreef op zaterdag 12 maart 2005 @ 13:33:
[...]

Mijn oog viel idd op dat stukje, dat kan zo beter:
PHP:
1
2
3
4
5
6
        if ( $maand == $itemarray[2] )
        {
            $textitem = str_replace("<br>", "<br>\r\n", $itemarray[0]);
            $formcontents.= "<div class='msgtop' id='wit' style='font-weight: bold;'>".$itemarray[1].", ".$itemarray[2]."</div><div class='msgmid'>".$textitem."</div><div class='msgbot'></div><br>"; 
        }
        $i++;

$i++ wordt nl altijd uitgevoerd, dus dan kan ie beter uit de if-else
Juischt, dat laatste wat je zegt klopt als een bus. Stom dat ik dat dan gewoon niet zie, een jaartje geleden ofzo had ik dr nog wel oog voor... maar nu. Bedankt in ieder geval :)

(Trouwens wel lief dat jullie die hele $formcontents.='bladiebla hier divs enzo' hebben zitten quoten maar dat is nog van de pagina waar ik hem uit heb gehaald :+ en zal straks allemaal verdwijnen. Sorry!

heidiulrich.nl | adventura.nl : rugzakavonturen | pathwise.nl : prepping geeks to get jobs


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Dark Blue schreef op zaterdag 12 maart 2005 @ 13:45:
Holy Moses, is dat de hele functie! :P Mijn dank is supergroot zeg, ... ik zal hem straks even doorlezen, als ik hem snap gebruik ik hem want hoe korter hoe beter natuurlijk. _O_
Check mijn post nog een keer. Ik heb de for() lus vervangen door een foreach(). Nog efficienter ;)

Het is niet alleen die regel trouwens die anders is. Ook $textLines[$i] zijn dus vervangen door $line, dus let daar even op.

Maar wat ga je nou doen met $formcontents. Daar ben ik ook wel benieuwd naar. Mischien van er dan nog wel wat te verbeteren :)

Laat trouwens eens een voorbeeldje van de ouput van planning.inc.php zien. Daar ben ik ook wel benieuwd naar. En geef eens aan hoe je de uitkomst van de functie wilt hebben. Mischien dat het nog wel veel korter kan, dat kan ik zo niet zien iig.

[ Voor 17% gewijzigd door Michali op 12-03-2005 14:51 ]

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • Dark Blue
  • Registratie: Februari 2001
  • Laatst online: 05-09 10:36

Dark Blue

Compositionista!

Alpenmeisje

Topicstarter
Michali schreef op zaterdag 12 maart 2005 @ 14:47:
[...]

Maar wat ga je nou doen met $formcontents. Daar ben ik ook wel benieuwd naar. Mischien van er dan nog wel wat te verbeteren :)
Zoals ik al zei, dit is een oud script dat ooit deel uitmaakte van een grote CMS. $formcontents is dus wel zeker gebruikt voor iets, maar doordat ik de CMS gestript heb naar bruikbare functies is het nut van sommige variabelen er totaal uit. Ik zal zsm naar het script kijken.
Laat trouwens eens een voorbeeldje van de ouput van planning.inc.php zien. Daar ben ik ook wel benieuwd naar. En geef eens aan hoe je de uitkomst van de functie wilt hebben. Mischien dat het nog wel veel korter kan, dat kan ik zo niet zien iig.
http://www.stylite.nl/ehbo/planning/planscherm.inc.php
dat is wat hij uitpoept op het moment. Morgen moet er content in komen en moet de edit pagina een serieuze layout krijgen (dit groene is de layout van een site waar hij eerder in stond O-) )

heidiulrich.nl | adventura.nl : rugzakavonturen | pathwise.nl : prepping geeks to get jobs


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Michali schreef op zaterdag 12 maart 2005 @ 14:47:
Check mijn post nog een keer. Ik heb de for() lus vervangen door een foreach(). Nog efficienter ;)
offtopic:
Is dat zo? Is een foreach echt efficiënter? Een foreach maakt toch van elk array-element om de beurt een kopie, en laat je daar dan mee werken. Wanneer die array-elementen zelf integers zijn, dan werkt het even efficiënt als een normale for, maar als het strings, arrays of objecten zijn, dan zou het theoretisch juist minder efficïent moeten zijn om foreach te gebruiken, aangezien dan de hele string/array/object gekopiëerd moet worden.

Wat dat betreft levert een foreach dus mooiere code op, maar ik zet mijn vraagtekens bij het efficiënter zijn dan een gewone for. :)

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

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
-NMe- schreef op zondag 13 maart 2005 @ 14:58:
[...]

offtopic:
Is dat zo? Is een foreach echt efficiënter? Een foreach maakt toch van elk array-element om de beurt een kopie, en laat je daar dan mee werken. Wanneer die array-elementen zelf integers zijn, dan werkt het even efficiënt als een normale for, maar als het strings, arrays of objecten zijn, dan zou het theoretisch juist minder efficïent moeten zijn om foreach te gebruiken, aangezien dan de hele string/array/object gekopiëerd moet worden.

Wat dat betreft levert een foreach dus mooiere code op, maar ik zet mijn vraagtekens bij het efficiënter zijn dan een gewone for. :)
offtopic:
Ik bedoelde het inderdaad meer in de zin van simpelere code en niet zo zeer een performance winst.

Noushka's Magnificent Dream | Unity

Pagina: 1