[PHP/MySQL]Probleem met reserveren advertentieruimte op A4

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Wizz15
  • Registratie: Januari 2004
  • Laatst online: 26-10-2022
Voor een opdracht ben ik bezig met het maken van een systeem waarmee advertentie ruimte verkocht wordt op een folder. Er zijn een aantal vaste formaten voor de advertentieruimtes, maar er is geen vaste layout. De advertentie ruimtes zijn gebaseerd op de Ax papierformaten. De afmetingen komen echter niet helemaal overeen, omdat de folder zelf A4 is en er marges op zitten plus een header bovenaan.

Voor het gemak heb ik even een overzichtje gemaakt van de verschillende formaten.

Afbeeldingslocatie: http://www.rikbruil.com/formaten.gif

Dit zijn alle formaten die er zijn (ik heb er een paar in elkaar gezet maar wel met andere kleuren). De S of L op het eind staat voor staand of liggend. Niet alle formaten hebben een staande of liggende variant, alleen de formaten waar dit is aangegeven.

Het probleem is dus nu, dat er een systeem moet komen wat op basis van de al bestelde advertentieruimtes moet kunnen aangeven welke formaten nog beschikbaar zijn. Eerst dacht ik dat ik dit makkelijk kon oplossen door gewoon de oppervlakte van de totale pagina minus de oppervlakte van de bestelde advertentieruimtes te nemen. Aan de hand van de uitkomst kijken welke ruimtes binnen het overgebleven oppervlak passen en desnoods hoeveel keer.

Dit liep echter stuk doordat je dus staande en liggende varianten hebt. Zo denkt het systeem dus dat er makkelijk 4 FA6L advertenties op 1 pagina kunnen, terwijl dit in de praktijk dus totaal niet het geval is. Mijn eerste stap was dus om in de tabel met de formaten een extra kolom aan te maken met het maximum aantal keer dat een advertentieruimte op een verder lege pagina kan staan. Dit was echter niet efficiënt. Hierna kreeg ik het idee om de totale pagina (het FA4 formaat) op te delen in denkbeeldige cellen. De pagina is dan 4 cellen breed en 8 cellen hoog.

Vervolgens heb ik voor elk formaat in de database vastgelegd hoeveel cellen dit formaat breed is, en hoeveel cellen hoog. Maar op dit punt zit ik weer vast. Ik wil dus dat het systeem kan 'zien' dat als er 1 advertentie van het FA6L formaat (2 cellen hoog, 3 breed) is besteld er nog maar 1 rij met cellen over is naast deze advertentie, en dat hier dus ook alleen een FA9S langs kan (2 cellen hoog, 1 breed).

Het systeem hoeft geen layout voor te schotelen of zo, maar het probleem is dus dat het nu maar gewoon alle lege ruimte op 1 hoop gooit en hier mee gaat werken. Ik zou dus graag willen dat het rekening kan houden met de hoogte en breedte van de pagina en de advertenties.

Ik vroeg mij af of er al ooit eens zoiets is gemaakt, of dat iemand hier al eens mee heeft gewerkt. Ik zou namelijk geen idee hebben waar ik bij google op moet zoeken (of op dit forum). Mijn excuses voor het lange verhaal, maar ik zit hier nu al een week mee te stoeien en ik vond dat er ook wat uitleg bij moest. Ik hoop dat het allemaal een beetje duidelijk is, zo niet dan hoor ik het wel en wil ik het wel wat verder uitleggen. En mocht iemand wat code nodig hebben dan zal ik dat hier wel posten.

Alvast bedankt in ieder geval :)

PS. Dit is trouwens geen code request of zo, maar ik zoek een beetje een duwtje in de goede richting. Ik vermoed dat het gewoon met een beetje wiskunde op te lossen moet zijn, maar wiskunde is niet mijn sterkste punt;)

PSN: RikBruil | BFBC2 stats


Acties:
  • 0 Henk 'm!

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

Janoz

Moderator Devschuur®

!litemod

Dit probleem is eigenlijk alleen maar op te lossen door daadwerkelijk layouts van de reeds bestelde advertenties te genereren en hieruit bepalen wat eventueel nog mogelijk is. Dit is echter een behoorlijk ingewikkeld probleem wat je niet in de database zomaar op kunt lossen. In principe is dit een stapel probleem waarvan de oplossing NP-Compleet is. In het kort komt dat er op neer dat er geen ideale oplossing bestaat, anders dan brute forcen. Aangezien het hier over een redelijk klein opervlak gaat (4 bij 8 cellen) valt de brute force oplossing echter nog wel mee. Zeker ook als je je gegenereerde layouts bewaard en aanpast zodra er een nieuwe advertentie verkocht is.

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!

Verwijderd

je zou ook voor jezelf alle mogelijke combinaties kunnen bepalen en dan iedere keer nadat iemand iets heeft besteld kijken welke combinatie nog mogelijk is en dit voor de volgende klant aangeven. Een combinatie bestaat dan uit verschillende vlakken... Dit is niet de meest "berekenende" methode maar wel de meest eenvoudige denk ik...

Acties:
  • 0 Henk 'm!

  • Wizz15
  • Registratie: Januari 2004
  • Laatst online: 26-10-2022
Ik heb het al bijna werkend, in ieder geval bedankt voor de hulp iedereen! :D

Wat ik heb gedaan is: ik heb nu een array gemaakt waar alle rijen in staan (8 dus in totaal). Op elke rij heb ik weer een array staan met weer 4 keys (dit zijn de cellen van links naar rechts). Het is dus een multidimensionale array geworden.

Vervolgens ga ik alle bestelde advertenties af en geef per cel op in die array of hij gebruikt wordt bij die advertentie of niet. Het is een beetje moeilijk uit te leggen, maar het werkt wel al bijna. Ik heb het in ieder geval zo ver dat hij middels gekleurde vakken in een HTML table laat zien welke cellen gebruikt zijn (rood), en de positie waar de nieuwe advertentie moet komen (groen), de lege cellen die nog over zijn blijven gewoon wit.

Ik zal binnenkort wel een kleine demo online zetten zodat jullie ongeveer kunnen zien hoe ik het nu heb opgelost. Als alles eenmaal werkt is het slechts een kwestie van alle beschikbare formaten uit de database te halen en voor elk formaat apart te kijken of het nog op de pagina past (waar dus de bestelde advertenties staan).

[ Voor 5% gewijzigd door Wizz15 op 15-02-2006 00:09 ]

PSN: RikBruil | BFBC2 stats


  • Wizz15
  • Registratie: Januari 2004
  • Laatst online: 26-10-2022
Er staat nu een voorbeeldje live op http://www.rikbruil.com/ads/

Ik loop daar door een array met formaten en check bij elk formaat of er nog ruimte is voor dat formaat. Het rode gedeelte is de ruimte die al in gebruik is, het groene gedeelte is de plek waar de nieuwe advertentie geplaatst kan worden.

Nogmaals bedankt voor de reacties ;)

PSN: RikBruil | BFBC2 stats