Een offset/factor bereken in een array

Moderators: dirkwb, Xilvo

Forumregels
(Middelbare) school-achtige vragen naar het forum "Huiswerk en Practica" a.u.b.
Zie eerst de Huiswerkbijsluiter
Reageer
Berichten: 3

Een offset/factor bereken in een array

Hoi,

Ik ben bezig met het maken van een website. Programmeren dat lukt me wel maar nu zit ik vast met een berekening. Het is een beetje lastig voor mij te omschrijven maar ik zal mijn best doen.

Ik heb een pagina nummering probleempje. Op mijn pagina is wel al een gewone paginanummering aanwezig maar ik ben nu bezig met een paginanummering voor mijn fotos, een fotonummering.

Wanneer je op de site op een foto klikt dan zie je de foto in het groot, daaronder wil ik de nummering in de vorm van:

foto 1, foto2, huidige foto, foto 4, foto 5

Nu doet zich het volgende probleem voor:

bekijk ik:

foto nr 1 dan zie ik: foto 2, foto 3, foto 4, foto 5 //goed

foto nr 2 dan zie ik: foto 1, foto 3, foto 4, foto 5 //goed

foto nr 3 dan zie ik: foto 2, foto 4, foto 5, foto 6 //fout

foto nr 4 dan zie ik: foto 2, foto 3, foto 5, foto 6 //goed

bij foto 3 wil ik zien: foto 1, foto2, foto 4, foto 5

Er is iets fout met de manier waarop ik mijn offset bereken. Ik kan wel een andere manier bedenken waarop het misschien zou kunnen werken (dmv een while loop en een teller) maar dat is minder mooi. Weet iemand misschien hoe ik de offset goed zou kunnen berekenen? Of misschien een andere manier om dit goed op te lossen?

Als het niet duidelijk is ofzo dan hoor ik het wel, alvast heel erg bedankt.

probleem!

Het enige probleem wat ik nu heb is het probleem met de offset op de 3e pagina.

als ik 4 paginanummers wil (2 volgende en 2 vorige wanneer je in het midden van een gallery zit of 1 volgende en 3 vorige als je op de voor laatste foto zit) dan ziet het er als volgt uit:

Code: Selecteer alles

paginanr, array_size, offset 

1              4                 0 

2              5                 0 

3              6                 0 

4              7                 1 

5              8                 2
Offset

De offset is hoever ik moet inspringen als ik bijvoorbeeld op pagina 5 zit dan is de offset twee om de volgende reden. Kijk ik naar wat er in de reeks zit dan zie je:

1, 2, 3, 4, 6, 7, 8, 9

Hiervan wil ik alleen laten zien: 3,4,6,7 de offset is dus 2 omdat ik begin bij 3.

Zit ik op pagina 3 dan is de reeks

1, 2, 4, 5, 6, 7

Hiervan wil ik laten zien 1,2,4,5. De offset is 0.

Voor de geinteresseerden is hier de PHP code:

Code: Selecteer alles

function getFotoNummering($id, $bestandsnaam, $gallery_id, $aantal_nummers)

{

       	 

  $sql = "SELECT id, bestandsnaam FROM fotos WHERE id < '" . $id . "' AND gallery_id = '" . $gallery_id . "' ORDER BY fotos.id DESC LIMIT 0, " . $aantal_nummers;

  $rs_ouder = mysql_query($sql) or die(mysql_error());

  

  $sql = "SELECT id, bestandsnaam FROM fotos WHERE id > '" . $id . "' AND gallery_id = '" . $gallery_id . "' LIMIT 0, " . $aantal_nummers;

  $rs_nieuwer = mysql_query($sql);

  

  while($data = mysql_fetch_array($rs_ouder))

  {

 	 $arr_nummering[$data["id"]]["bestandsnaam"] = $data["bestandsnaam"]; 

 	 $arr_nummering[$data["id"]]["id"]    = $data["id"];

  }

  

  $arr_nummering[$id]["bestandsnaam"] = $bestandsnaam;

  $arr_nummering[$id]["id"]    = $id;

  

  while($data = mysql_fetch_array($rs_nieuwer))

  {

 	 $arr_nummering[$data["id"]]["bestandsnaam"] = $data["bestandsnaam"]; 

 	 $arr_nummering[$data["id"]]["id"] 	 = $data["id"];

  }  

  

  //sorteren

  ksort($arr_nummering);

 	 

  //bereken de offset

  $aantal = mysql_num_rows($rs_ouder) + mysql_num_rows($rs_nieuwer);

  $offset = ( ($aantal) - $aantal_nummers); 	 

  $offset = / $offset

  //doet zich voor aan het eind van de gallery, omdraaien

  if(mysql_num_rows($rs_ouder) > mysql_num_rows($rs_nieuwer))

  {

 	 $arr_nummering = array_reverse($arr_nummering);

  }

  

  $arr_nummering = array_slice($arr_nummering,$offset,$aantal_nummers + 1);

  

  //doet zich voor aan het eind van de gallery, terugdraaien

  if(mysql_num_rows($rs_ouder) > mysql_num_rows($rs_nieuwer))

  {

   $arr_nummering = array_reverse($arr_nummering);

  }   	 

  

  $foto_nummering .= "aantalnr:" . $aantal_nummers . " arr_gr:" . count($arr_nummering) . " offset: " . $offset . "<br>";       	 

  

  //zet ze in de nummering

  foreach ($arr_nummering as $key => $value)

  {

 	 if($id == $value["id"])

    $foto_nummering .= "<img src='uploads/thumb_" . $value["bestandsnaam"] . "' style='width: 50px; height: 50px; Filter: Gray; Alpha(Opacity=50);'>";

 	 else 

    $foto_nummering .= " <a href='" . $_SERVER['PHP_SELF'] . "?pagina=gallery&actie=bekijk_foto&gallery_id=" . $gallery_id . "&id=" . $value["id"] . "'><img style='width: 50px; height: 50px;' src='uploads/thumb_" . $value["bestandsnaam"] . "'></a> ";

  } 	 

  

  //nu nog ding in het midden zetten 	 

  return $foto_nummering;

  

}
Mocht er iets onduidelijk zijn dan zal ik graag mijn best doen om het te verduidelijken. Ik hoop dat iemand er uit komt :) . Alvast heel erg bedankt!

Berichten: 3

Re: Een offset/factor bereken in een array

Even een bump :) . Ik weet het ik ben ongeduldig haha maar ik kom er gewoon niet uit en ben benieuwd of het wel uberhaupt mogelijk is met een gewone berekening.

Anders zal ik denk ik toch een andere oplossing moeten maken :) .

Berichten: 92

Re: Een offset/factor bereken in een array

Spelregels van dit forum: Bumpen is verboden.

Enkele suggesties:

- Slice functie correct gebruikt?

- Waarom haal je niet direct de juiste gegevens op uit je database?

- Wat bevat $aantal_nummers, is dit in jouw geval 4?

- Nergens vergeten te tellen vanaf 0 ipv 1?

Weet dat het echt niet zo éénvoudig is om daar als niet schrijver van deze functie een antwoord op te geven. Je verplicht ons om heel je functie van begin tot einde uit te vlooien, en daar kruipt aardig wat tijd in.

Bovendien zit je hier op een wetenschapsforum. Daarmee bedoel ik niet dat hier geen mensen zitten die kunnen programmeren maar wel dat de meeste hier komen om wetenschappelijke problemen te beantwoorden of voor te stellen.

Mijn ervaring met dit soort dingen is dat je gewoon elke tussenstap moet debuggen, dwz laten zien wat de inhoud is van alle variabelen na elke stap die je maakt en zo nagaan wanneer het fout loopt.

Wat ook helpt is gewoon een alternatief algoritme uitzoeken. Zou snel moeten gaan want je hebt ondertussen het probleem al grondig geanaliseerd. Soms is het sneller om iets opnieuw te maken dan een foutief ding te herstellen.

Gebruikersavatar
Berichten: 5.679

Re: Een offset/factor bereken in een array

Is het niet makkelijker om te doen:

Code: Selecteer alles

$eersteFoto = $huidigeFoto-2;



if ($eersteFoto<0) $eersteFoto = 0;



$laatsteFoto = $eersteFoto+5; 



// $totaalAantalFotos is het totaal aantal fotos in je verzameling



if ($laatsteFoto>$totaalAantalFotos) $laatsteFoto = $totaalAantalFotos;







for ($i=$eersteFoto; $i<$laatsteFoto; $i++)



{



  // en hier haal je dan foto [$i] uit je array of database of wat dan ook



  ToonFoto($i);



}


Wil je het helemaal correct en ook het aantal foto's instelbaar:

Code: Selecteer alles

// $aantalFotos is het aantal foto's wat je wilt weergeven, bijv. 5



$eersteFoto = max(0,$huidigeFoto-int($aantalFotos/2)); 







// $totaalAantalFotos is het totaal aantal fotos in je verzameling



$laatsteFoto = min($totaalAantalFotos,$eersteFoto+$aantalFotos);



if ($laatsteFoto==$totaalAantalFotos) $eersteFoto = max(0,$laatsteFoto-$aantalFotos);







for ($i=..etc, zelfde als boven)
In theory, there's no difference between theory and practice. In practice, there is.

Berichten: 3

Re: Een offset/factor bereken in een array

Rogier:

Hey die tweede optie lijkt me op het eerste gezicht wel wat even kijken hoe die werkt en hoe ik die kan implementeren.

Koen:

Sorry ik wist niet dat bumpen verboden was. Het was ook niet de bedoeling om iedereen mijn hele functie door te laten spitten. Het ging me puur om de offset berekening en ik hoopte dat met de tekst om de functie heen uit te leggen maar voor de zekerheid en programmeurs onder ons heb ik de functie er alsnog bij gezet.

De juiste gegevens ophalen uit de database leek me nog moeilijker. Als ik een paginanummering wil inbouwen en ik haal rechtstreeks het goede uit de database dan moet ik op de een of andere manier ervoor zorgen dat ik in 1 keer zowel alles wat kleiner is dan de huidige pagina als alles wat groter is en dat met een variabele limit.

Dit is te programmeren hoor, maar ik wil de functie zo klein mogelijk houden.

Ik heb verschillende malen geprobeerd met 1 en 0 om te wisselen op diverse plekken (vooral bij de slice en offset berekening) maar dit wilde niet echt lukken.

De slice functie werkt perfect op pagina 1, 2, 4 en hoger. Alleen bij 3 krijg ik dus de verkeerde offset door :) . Ik heb constant de variabelen uitgelezen van de array(s) en de offset. zo kwam ik er achter dat de offset berekening niet klopte. Alleen kon ik hier geen oplossing voor vinden.

Met de oplossing van Rogier gaat het over een hele andere bocht dus die ga ik eerst zo of vanavond even proberen, kijken of dat lukt.

Heel erg bedankt.

EDIT: HET ANTWOORD!!

Woohoo bedankt rogier door jou kwam ik op het antwoord. De offset berekenen doe je als volgt:

$offset = (($aantal_in_array - $aantal_gewilde_paginanrs) - ($aantal_gewilde_paginanrs / 2));

vervolgens kijk je of $offset kleiner is dan 0, is hij kleiner dan 0 dan is de offset 0 :?: .

Nu is dit met max() misschien nog even wat mooier maar hij werkt nu in ieder geval zonder dat ik verder code heb moeten wijzigen.

Reageer