Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

[PHP] 'Random' content tonen. 9 van de 15+ tegels tonen

Pagina: 1
Acties:

Onderwerpen


Verwijderd

Topicstarter
Hi Webdevvers,

Een breinbreker...

Ik ben bezig met het designen van een frontpage. De pagina gaat alleen tegels bevallen, bestaande uit thumbs en titlebars. Hover je op een tegel, dan wordt ie een aantal px groter, schaduw wordt donkerder, etc...

De tegels bestaan uit:
code:
1
2
3
4
5
6
7
8
9
10
11
<div class="1">
 <div class="2">
  <div class="3"></div>
  <a class="4" href="#">
  <img src="http://">
  <div class="titlebar">
  <span class="title">Titeltekst.</span>
  </a>
  </div>
 </div>
</div>


De pagina biedt ruimte voor 9 tegels. Ik heb echter 15 of meer tegels content.

Ik zou graag een script willen maken/gebruiken dat een selectie maakt uit die 15 tegels en er slechts 9 toont. Binnen die 9 mag iedere tegel slechts 1 keer voorkomen. Bij een refresh van de pagina zijn de tegels anders.

Googlen leverde mij tot nu toe geen goeie oplossing. Daar blijft het beperkt tot het roteren van een aantal images binnen 1 div.

Bij wie doet dit een belletje rinkelen? :)

Thanks!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Zo moeilijk is dat toch niet? Vul een array met 15 elementen en pluk er random 9 uit. Wanneer je ze "uitkiest" verwijder je ze meteen uit de array.



code:
1
2
3
4
5
6
7
8
myitems = ['...', '...', '...', '...', '...', '...', ...]    //Items array
selected = []                  //Selected items

for (i = 0 to 9) {             //Take 9 elements...
  r = rnd() * myitems.size     //...from random index from myitems
  selected.add( myitems[r] )   //...add to selection
  myitems.remove( r );         //...remove from possible choices
}

[ Voor 22% gewijzigd door RobIII op 28-04-2012 00:12 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • orf
  • Registratie: Augustus 2005
  • Laatst online: 23:23

orf

Je kunt een array shuffelen en dan de eerste 9 gebruiken. Of als je een database gebruikt de random order van de database gebruiken.

PHP:
1
2
3
4
5
6
<?php

$items = array(1,2,3);
shufffle($items);
$output = array_slice($items, 0, 9); 
?>

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
orf schreef op zaterdag 28 april 2012 @ 00:12:
Je kunt een array shuffelen en dan de eerste 9 gebruiken
In PHP heb je, inderdaad, een native shuffle functie; dit topic staat in WEB dus ik neem even aan dat we 't over JS hebben. (?)
orf schreef op zaterdag 28 april 2012 @ 00:12:
Of als je een database gebruikt de random order van de database gebruiken.
Dat is in veel gevallen een verdomd "dure" operatie (als je niet oppast althans); in dat geval zal namelijk eerst voor alle(!) records in de tabel (wat er goed een paar miljoen kunnen zijn) een random getal moeten worden toegekend, daarna moeten alle(!) records gesorteerd worden om de top X (of: limit 0, X) te kunnen nemen. Het kan wel slimmer/efficiënter door met een subquery oid. eerst een top X te nemen (of iets anders waardoor je nog maar de gewenste 15 overhoudt) en daarna pas te orderen op een random maar dan moet je daar dus wel even op letten en niet zomaar blind dit "truukje" implementeren zonder de risico's te kennen ;) Just saying.

[ Voor 4% gewijzigd door RobIII op 28-04-2012 00:18 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • orf
  • Registratie: Augustus 2005
  • Laatst online: 23:23

orf

RobIII schreef op zaterdag 28 april 2012 @ 00:15:
[...]

In PHP heb je een native shuffle functie; dit topic staat in WEB dus ik neem even aan dat we 't over JS hebben. (?)
In de titel staat [PHP] ;)

En ik weet dat sorteren in de database een dure operatie is, maar de TS heeft het over 15+ items. Geen aantallen om voor te gaan optimaliseren dus.

[ Voor 22% gewijzigd door orf op 28-04-2012 00:18 ]


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
orf schreef op zaterdag 28 april 2012 @ 00:16:
[...]


In de titel staat [PHP] ;)
Dan krijgt dit topic een schop naar PRG :P
(@soulwack: Waar hoort mijn topic?)
orf schreef op zaterdag 28 april 2012 @ 00:16:
En ik weet dat sorteren in de database een dure operatie is, maar de TS heeft het over 15+ items. Geen aantallen om voor te gaan optimaliseren dus.
Ja, die 15 zijn over na "een" selectie (even aangenomen dat 't überhaupt uit een DB komt). All I'm saying is dat 'ie met 't aanpassen van z'n query dan dus wel even moet oppassen niet domweg een 'order by rand()' er in te flikkeren want dat kon wel eens pijn gaan doen ;) Die order wil je dus pas toepassen nadat je nog maar 15 records over hebt.

Oh en 4.294.967.295 valt ook onder "15+" natuurlijk ;)

[ Voor 54% gewijzigd door RobIII op 28-04-2012 00:21 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Verwijderd

Topicstarter
Ik gebruik drupal, dus inderdaad een database. Alle tegels zitten wel in 1 en dezelfde node, als in 1 enkele html page.

Ik ben niet zo sterk in scripting... Dus ik begrijp nog niet precies wat ik nu moet doen.

Wat ik wel begrijp is het principe:
iedere tegel komt in een apart 'slot' in n array.
Ik gebruik een randomfunctie om een tegel te selecteren.
Die betreffende tegel krijgt een vlag 'gebruikt'
Ik doe dit tot 9 tegels.

Hoe ik dit moet schrijven, is mij echter nog niet duidelijk.

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op zaterdag 28 april 2012 @ 00:46:
Die betreffende tegel krijgt een vlag 'gebruikt'
Niet eens een vlag; zie 't als een stapel van 15 kaarten/tegels waar je er gewoon 9 "uit" pakt. De stapel wordt steeds kleiner (en daarmee de max. waarde van je random dus ook; hence regel 5 in mijn pseudocode die de "huidige stapel grootte" meeneemt in het bepalen van een random nummer ;) )
Verwijderd schreef op zaterdag 28 april 2012 @ 00:46:
Hoe ik dit moet schrijven, is mij echter nog niet duidelijk.
Doe eens gek en doe eens een poging? We willen je best in de juiste richting wijzen maar 't aanleveren op een zilveren presenteerblaadje doen we hier niet aan ;) Als je concrete vragen hebt (als je dus een poging hebt gedaan) dan zijn die natuurlijk wél van harte welkom ;)

Maar nu we er uit zijn dat 't PHP betreft zou ik inderdaad gewoon voor de shuffle() gaan en een array_slice() als dat nog nodig is.

[ Voor 12% gewijzigd door RobIII op 28-04-2012 01:21 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Verwijderd

Topicstarter
Ben ik met je eens.

Ik ga mijn poging morgen showen, hebben jullie ook een leuk weekend ;)

Verwijderd

Topicstarter
Thanks for the help! Het is inderdaad gelukt :)

Mijn oplossing, in dit voorbeeld voor 2 tegels selecteren uit 3, zonder duplicaat.

code:
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
34
35
36
37
<?php 
$links = array(
'link1',
'link2',
'link3');

$images = array(
'image_03.jpg',
'image_05.jpg',
'image_07.jpg');

$titles = array(
'title1.',
'title2.',
'title3.');

for ($i=0;$i<=1;$i++){
  $random = rand(0,(count($links)-1));
  echo "<div class=\"1\">";
  echo "<div class=\"2\">";
  echo "<div class=\"3\"></div>";
  echo "<a class=\"4\" href=\"$links[$random]\">";
  echo "<img src=\"http://www.url.nl/$images[$random]\">";
  echo "<div class=\"titlebar\">";
  echo "<span class=\"title\">$random $titles[$random]</span>";
  echo "</a>";
  echo "</div>";
  echo "</div>";
  echo "</div>";
  unset($links[$random]);
  $links = array_values($links);
  unset($images[$random]);
  $images = array_values($images);
  unset($titles[$random]);
  $titles = array_values($titles);
};
?>


So far so good!

Terug naar mijn 9 tegels uit 15 situatie: Ik kom er nu achter dat er sommige tegels zijn die ik op een vaste plek wil zetten. Bijvoorbeeld locatie 1,3,5 en 7 (tellend van 0 tot 8).

Hoe kan ik dat nu als beste regelen? als bij i=0 al gelijk de tegel eruit gehaald wordt die ik op locatie 1 wil zetten, heb ik een probleem...

  • l1dert
  • Registratie: Oktober 2007
  • Laatst online: 26-08 12:19
Als eerste zou ik je datastructuur iets anders opzetten door al je informatie te groeperen in een object (of array) en die dan in een array te stoppen, dat wordt dan je source array. Vervolgens maak je een array aan waarin je de uiteindelijke tegels gaat zetten, die vul je met de tegels uit de source array. En aan het eind ga je die array alle tegels pas weergeven.

Als je de code volgens die methode heb aangepast hoef je alleen het vullen van je output array aan te passen voor de vaste items. Dat kan dan bijvoorbeeld door eerst alle items met een vast plek in de resultaat array met tegeltjes te zetten. En dan de lege plekken te vullen met random items die nog over zijn in de source array.

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Logisch nadenken. Je hebt 9 tiles. 4 daarvan hebben een vaste plek. 5 hebben dat niet. Twee verschillende arrays maken. In de eerste zet je op volgorde de 4 items die je op vaste plekken hebben wil, in de tweede shuffle je de andere 5. Dan:
PHP:
1
2
3
4
5
6
7
8
for ($i = 0; $i < 9; $i++) {
  if ($i == 1 || $i == 3 || $i == 5 || $i == 7)
    $workingArray = $array1;
  else
    $workingArray = $array2;
  // afdrukken eerste element van de array waar je mee bezig bent
  // eerste element van die array verwijderen
}

En dit is nog wel de simpelste fix, het kan nog beter en robuuster. Weinig ervaring hebben met programmeren wil niet zeggen dat je niet na kan denken over hoe je dit zelf met bijvoorbeeld speelkaarten zou kunnen oplossen.

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

Pagina: 1