[PHP] 2 koloms algoritme

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • 1st_Ro
  • Registratie: December 2002
  • Laatst online: 07-01-2022
Goedenavond iedereen!

Ik heb even een probleem waar ik niet uitkom.
Ik ben bezig met een site waar een stel links (ongeveer 30) op komen in een 2 koloms layout. Elke link heeft een eigen DIV (CSS etc.) .

Deze links komen allemaal uit een database (MySQL) en worden gesorteerd op de datum van toevoeging (de nieuwste links boven)

Nu wil ik de 2 kolommen in het volgende formaat hebben:

code:
1
2
3
4
| 1 | 5 |
| 2 | 6 |
| 3 | 7 |
| 4 | 8 |


Waarbij in dit voorbeeld 1 de nieuwste link is en 8 de oudste.

Qua opbouw van de HTML gaat het van 1 naar 5 naar 2 naar 6 etc. (float:left, float:right etc.)

Nu heb ik al een tijdje zitten te denken hoe ik dit kan doen, want een simpel loopje maken door de database heen wordt lastig, gezien de HTML structuur.

Hoe kan ik dit het beste/makkelijkste oplossen ? Het is dus eigenlijk het nonlineair uitlezen uit de database en dat heb ik dus nog nooit gedaan :X

Even voor de duidelijkheid, ik snap wel hoe ik alles uit de database haal, maar hoe ik alles in deze layout krijg is me nog even een raadsel!

Alvast bedankt !

Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Ik denk dat je het het beste in een array kan zetten (mysql_fetch_array), en dan die array sorteren op de manier die je wil, met een eigengeschreven functie. Het lijkt me niet dat je dit zomaar kan doen met alleen je database.
Wat je wel kan doen is absoluut positioneren door een x en y op te geven, dan kun je gewoon op de 'normale' volgorde de elementen in je HTML zetten. :)

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

  • 1st_Ro
  • Registratie: December 2002
  • Laatst online: 07-01-2022
mysql_fetch_array had ik al (ben gewone loopjes wel gewend).

Maar dan moet ik dus inderdaad een functie vinden die die info netjes kan sorteren voor me.

Kan PHP 2 dimensionale arrays aan ? Misschien dat het daarmee kan ? (ik brainstorm even, dus als ik verkeerd denk, corrigeer me even)

Dus zoiets:

code:
1
2
3
4
5
6
$array[0][1] = datum/tijd
$array[0][2] = titel
$array[0][2] = URL
$array[1][1] = datum/tijd
$array[1][2] = titel
$array[1][2] = URL


Als dat zou kunnen ben ik een end! Ik ga even op onderzoek uit ;)

Oh, en absoluut positioneren wil ik liever niet en het kan in dit geval ook niet om dat er tekst bovenstaat die variabel is qua lengte :)

[ Voor 12% gewijzigd door 1st_Ro op 06-09-2004 20:01 ]


Acties:
  • 0 Henk 'm!

  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Als je allemaal opvolgende nummers hebt kun je met een truukje dit ook in de SQL al oplossen.
code:
1
2
3
4
select volgorde_nummer
from tabel
order by mod(volgorde_nummer, [paginalengte])
, volgorde_nummer

Who is John Galt?


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

justmental schreef op 06 september 2004 @ 20:03:
Als je allemaal opvolgende nummers hebt kun je met een truukje dit ook in de SQL al oplossen.
code:
1
2
3
4
select volgorde_nummer
from tabel
order by mod(volgorde_nummer, [paginalengte])
, volgorde_nummer
Ik denk niet dat dat bruikbaar is. Zoals in elke database zullen ook hier wel records verwijderd kunnen worden, en id's (PK's) wijzigen is een slecht plan, dus zullen er altijd gaten mogelijk zijn. :)
1st_Ro schreef op 06 september 2004 @ 20:00:
mysql_fetch_array had ik al (ben gewone loopjes wel gewend).
Dat je loopjes kent wil niet zeggen dat je bekend bent met mysql_fetch_array, maar goed. :)
Maar dan moet ik dus inderdaad een functie vinden die die info netjes kan sorteren voor me.
Die moet je niet vinden, maar maken. Stelt vrij weinig voor. :)
Kan PHP 2 dimensionale arrays aan ? Misschien dat het daarmee kan ? (ik brainstorm even, dus als ik verkeerd denk, corrigeer me even)

Dus zoiets:

code:
1
..
Dat mag gewoon, is geen probleem. :)
Oh, en absoluut positioneren wil ik liever niet en het kan in dit geval ook niet om dat er tekst bovenstaat die variabel is qua lengte :)
Dat hoeft ook geen probleem te zijn, kun je berekeningen op los laten, maar dat is vrij overbodig als je zelf ff je array sorteert. :)

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

  • 1st_Ro
  • Registratie: December 2002
  • Laatst online: 07-01-2022
Waar een beetje brainstormen al niet goed voor is ;)
Volgens mij ben ik er uit.

Een 2 dimensionale array is denk ik toch het makkelijkst :)
Even in (gedeeltelijke) pseudocode:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        $i=0;
        $total = mysql_query(SELECT COUNT(*) FROM table WHERE 1");
        $half = $total/2;
    $query = mysql_query("SELECT * FROM table WHERE 1");
    while ($result =@ mysql_fetch_array($query)) {
        $array[$i][0] = $result[0];
        $array[$i][1] = $result[1];
        $array[$i][2] = $result[2];
        $array[$i][3] = $result[3];
        $array[$i][4] = $result[4];
        $array[$i][5] = $result[5];
        $i++;
    }   

         for ($j=0; $j < $half; $j++) {
              echo "<div>".$array[$j][1]."</div";
              echo "<div>".$array[$j+$half][1]."</div";
         }


Het is heel erg pseudo (ben nog met mijn eigen code bezig), dus ik zal vast nog wat fouten er uit moeten halen en uitzonderingen krijgen ... zoals bij een oneven aantal links, de laatste rechtse moet dan niet gemaakt worden :)

Acties:
  • 0 Henk 'm!

  • Macros
  • Registratie: Februari 2000
  • Laatst online: 15-05 16:29

Macros

I'm watching...

In $array zet je je data, gewoon op volgorde zoals het in de db staat
PHP:
1
2
3
4
5
6
7
8
9
10
11
//$columns = 2; of 3 of of 5628
$jump = ceil((sizeof($array)-1)/$columns);
for ($i=0; $i<$jump; $i++) {
      for ($c=0; $c<$columns; $c++) {
            $data = $array[$c*$jump+$i];
            if ($data) 
                  //print volle cell met $data
            else 
                  //print lege cell zonder data
      }
}

[ Voor 11% gewijzigd door Macros op 06-09-2004 20:23 ]

"Beauty is the ultimate defence against complexity." David Gelernter


Acties:
  • 0 Henk 'm!

  • 1st_Ro
  • Registratie: December 2002
  • Laatst online: 07-01-2022
Macros, maar ik werk niet met een table ... en aangezien ik 2 verschillende DIVs moet genereren (2 verschillende classes), is deze functie (hoe mooi hij ook is ;) ) niet nuttig voor me ... denk ik :P

Acties:
  • 0 Henk 'm!

Verwijderd

1st_Ro: Opzich post Macros hier wel een constructie die je zal moeten gebruiken, teminste de weg die het loopje zal maken. Dat Macros het voor een tabel gebruikt maakt niet zo veel uit, jij zou het ook kunnen gebruiken.
post eens een voorbeeldje zoals je het wil hebben, ik gebruik zelden div's (dus zie niet exact hoe je de html wil hebben, de output wel).

Acties:
  • 0 Henk 'm!

  • 1st_Ro
  • Registratie: December 2002
  • Laatst online: 07-01-2022
@KingOfDos, als ik het onthou dan post ik vanavond even mijn code. Ik heb het namelijk helemaal werkend ;)

Of het efficiënter kan dan wat ik heb gebouwd weet ik niet, maar aangezien het maar om ongeveer 30 records gaat denk ik dat je weinig performance verschil zal merken.
Toch ? ;)
Pagina: 1