[PHP] rekenen met modulus

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Mensen

Ik heb een probleem met het weergeven van images in de juiste kolommen.
Wil graag dat php 2 images per rij geeft, en daarna een nieuwe rij start.
In HTML termen:
code:
1
<tr><td></td><td></td></tr>


Ik heb een bepaalde functie welke een array returnt met daarin alle jpg files uit een bepaalde directory. De code die ik gebruik om deze files om te zetten in een tabel gaat als volgt:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// $result_array is de array met daarin de verwijzingen naar alle files uit directory $dir
$aantal=count($result_array);
$rijen=2; // 2 images per rij
$i=0;
echo "<tr>";  
    
for ($i=0; $i< $aantal;$i++) 
{       
$hoeveel=$i % $rijen;
echo "\n<td border=1>[img]/fotos/$dirname/$result_array[$i]></td>\n";
if($hoeveel==0)
{
echo"</tr><tr>";
}

}
echo[/img]";    


Nu werkt deze code wel, alleen niet op de goede manier.
Hij zet ten eerste op de eerste rij maar 1 image neer (logisch want 0%2=0).

Nu snap ik het probleem wel, alleen weet ik het niet op te lossen !
Zou iemand mij hiermee verder kunnen helpen ?
:)

[ Voor 10% gewijzigd door Verwijderd op 18-03-2005 14:21 ]


Acties:
  • 0 Henk 'm!

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

Scott

Ik ben, dus ik tweak

Door te zorgen dat bij de eerste rij $i geen 0 is, maar 1:

PHP:
1
2
3
4
5
6
7
8
for ($i=1; $i<= $aantal;$i++) 
{        
$hoeveel=$i % $rijen;
echo "\n<td border=1>[img]/fotos/$dirname/$result_array[$i]></td>\n";
if($hoeveel==0)
{
echo"</tr><tr[/img]";
}

Acties:
  • 0 Henk 'm!

  • dajappie
  • Registratie: Januari 2005
  • Laatst online: 13:10
Alleen valt dan het eerste array-element weg natuurlijk, dus dan even $i-1 doen.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ScottB schreef op vrijdag 18 maart 2005 @ 14:25:
Door te zorgen dat bij de eerste rij $i geen 0 is, maar 1:

PHP:
1
2
3
4
5
6
7
8
for ($i=1; $i<= $aantal;$i++) 
{        
$hoeveel=$i % $rijen;
echo "\n<td border=1>[img]/fotos/$dirname/$result_array[$i]></td>\n";
if($hoeveel==0)
{
echo"</tr><tr[/img]";
}
Dan pakt hij de eerste image uit de array niet :)

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 18:14
Een beetje doordenken had wel gemogen, maar aangezien je zo'n uitgebreidere topic start hebt getypt wil ik je er wel mee helpen: je begint te tellen bij 0, dus wil je dat op de eerste regel plaatje 0 en 1 staan, op de volgende 2 en 3, enzovoorts. Je wil dus een nieuwe regel beginnen na elk oneven getal; daarom moet je testen op $i%2 == 1. Die hele $hoeveelheid variabele is sowieso nogal overbodig.

Verder is dit soort code nogal tricky, want als je nu een even aantal plaatjes hebt (zeg, twee) dan genereer je de volgende code:
HTML:
1
2
3
4
5
<tr>  <!-- regel 5 -->
<td>...</td>  <!-- regel 10 -->
<td>...</td>  <!-- regel 10 -->
</tr><tr> <!-- regel 13 -->
</tr> <!-- regel 17 -->
Je genereert nu dus twee regels, terwijl de tweede regel helemaal leeg is. Dat klopt dus niet.

Zelf genereer ik daarom liever de nieuwe regel voor dat ik een cel vul en dan controleer ik expliciet of dit de eerste cel is (dan wil ik geen nieuwe regel beginnen):
PHP:
1
2
3
4
5
6
7
8
9
10
<?php
echo '<table><tr>';
for($n = 0; $n < $aantal; ++$n)
{
    if($n > 0 && $n%2 == 0)
        echo '</tr><tr>';
    echo '<td>',  'inhoud komt hier', '</td>';
}
echo '</tr></table>';
?>

Dit werkt voor een willekeurig aantal kolommen (je kunt die 2 op regel 4 door een willekeurig getal vervangen). Het enige 'randgeval' is wanneer aantal 0 is, dan genereer je een enkele 'lege' regel wat in HTML 4 volgens mij niet mag (maar lege tabellen mogen ueberhaupt niet, dacht ik, dus daar moet je sowieso op controleren).

(Merk op dat ik voor het geval met twee kolommen nu een nieuwe regel begin voor elk even getal, wat overeenkomt met een nieuwe regel na elk oneven getal.)

[ Voor 35% gewijzigd door Soultaker op 18-03-2005 14:50 ]


Acties:
  • 0 Henk 'm!

  • GX
  • Registratie: Augustus 2000
  • Laatst online: 14-05 09:40

GX

Nee.

Verwijderd schreef op vrijdag 18 maart 2005 @ 14:29:
[...]


Dan pakt hij de eerste image uit de array niet :)
PHP:
1
$result_array[($i-1)];

dan

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Soultaker schreef op vrijdag 18 maart 2005 @ 14:30:
Een beetje doordenken had wel gemogen, maar aangezien je zo'n uitgebreidere topic start hebt getypt wil ik je er wel mee helpen: je begint te tellen bij 0, dus wil je dat op de eerste regel plaatje 0 en 1 staan, op de volgende 2 en 3, enzovoorts. Je wil dus een nieuwe regel beginnen na elk oneven getal; daarom moet je testen op $i%2 == 1. Die hele $hoeveelheid variabele is sowieso nogal overbodig.
Perfect, duidelijke uitleg waar ik wat aan heb.
Werkt nu zeer mooi.
Goed dat dit topic er nu is gekomen, want op GoT was er nog geen met zo'n duidelijke uitleg.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Er zit trouwens nog wel een probleempje in je tabel. Wanneer je een oneven aantal plaatjes hebt zal de laatste row van je table niet helemaal netjes worden. Deze heeft immers maar 1 kolom ipv 2. Eigenlijk zul je aan het eind van je tabel nog een keer leuk met modulus aan de slag moeten om een lege cel met een colspan te genereren.

@soultaker: Hmm, als dat zo is heb ik mij tijden voor niks druk lopen maken ;). Ik heb altijd gedacht dat het enkel werkte door de coulantie van browsers.

[ Voor 20% gewijzigd door Janoz op 18-03-2005 16:00 ]

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 18:14
Janoz: check je HTML specificaties. ;) Dat is helemaal niet nodig: ontbrekende cellen in de HTML code zijn impliciet leeg (en dat betekent dus zeker niet dat die enkele cel de breedte van twee inneemt ofzoiets; die cel aan de linkerlankt ziet er net zo uit als de cel erboven). Denk er wel aan dat die 'ontbrekende' cellen ook geen borders ofzoiets krijgen, maar meestal is dat precies de bedoeling.

Acties:
  • 0 Henk 'm!

Verwijderd

Ik heb dit probleem ook eens gehad, ik heb het opgelost door twee for loopjes te gebruiken:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?
$max=ceil($aantal_images/2);//aantal rijen dat je wilt afdrukken
$i=0;
for ($i=0;$i<$max;$i++)
{
    echo"<tr>\n";
    $j=0;
    for ($j=0;$j<2;$j++) //$j<2 => max 2 kolommen 
    {
        if ($image_nummer<=$aantal_images)
        {
            echo"<td></td>\n";
            $j++;
        }
        else 
        {
            $i=$max+1;//geen image meer dus uit for loop gaan
        }           
    }
    echo"</tr>\n";
}
?>

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Soultaker schreef op vrijdag 18 maart 2005 @ 15:02:
Janoz: check je HTML specificaties. ;) Dat is helemaal niet nodig: ontbrekende cellen in de HTML code zijn impliciet leeg (en dat betekent dus zeker niet dat die enkele cel de breedte van twee inneemt ofzoiets; die cel aan de linkerlankt ziet er net zo uit als de cel erboven). Denk er wel aan dat die 'ontbrekende' cellen ook geen borders ofzoiets krijgen, maar meestal is dat precies de bedoeling.
De grote vraag zou moeten zijn: zou je hiervoor wel een tabel moeten gebruiken? ;)
In feite is dit een opsomming van afbeeldingen, en dus een unordered list zou beter zijn. Met behulp van float: left en een container (je UL dus) die precies zo breed is dat na het 2e plaatje in je listitem de volgende naar onder schuift bereik je vervolgens precies hetzelfde resultaat :)

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 18:14
Floating elements en IE 5. :X Daar krijg je echt nachtmerries van. Zelfs als je het goed werkend krijgt onder de meeste browsers (wat voor die table-constructie direct geldt, maar met CSS nog een aardige klus is) moet je er een flinke CSS-truckendoos voor opentrekken. Het eventuele voordeel van scheiding van content en lay-out wordt naar mijn mening in die gevallen ruimschoots gecompenseerd door de ontoegankelijkheid van de cryptische CSS code. De HTML code drukt in zo'n geval veel duidelijker uit wat de bedoeling is (plaatjes in een raster lay-outen) dan de CSS code die hetzelfde bereikt.

Verder is dit natuurlijk P&W en geen W&G, dus als de TS vraagt hoe hij met PHP bepaalde code moet genereren, dan leg ik dat uit, en ga ik niet over alternatieve HTML beginnen. ;)

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Ik ben het met je eens dat IE en z'n gebrekkige/buggy CSS-ondersteuning een beperkende factor kan zijn; zeker als je niet zo bedreven bent in CSS en browser-quirks. Daarnaast speelt inderdaad dat veel mensen onnodig op een verouderde versie blijven hangen.

Het is echter wel mogelijk en biedt je een aantal voordelen: zo is het makkelijker om achteraf het aantal plaatjes naast elkaar aan te passen, of dat zelfs mbv alternatieve stylesheets voor bijvoorbeeld andere devices te optimaliseren. ;)

Daarnaast is het juist een pré als je als PHP developer ook weet hebt van clientside technieken. Zeker als je je toch in zeker zin bezig houdt met het genereren van markup.

Intentionally left blank

Pagina: 1