Gå til innhold

Lager cms: Hvordan sortere visning av nyheter


Anbefalte innlegg

Hei!

 

Holder på å lage et CMS, og er i bunn og grunn langt på vei til å bli ferdig. Når en legger inn nyheter velger en om det skal være enkel eller dobbel bredde. Dobbel bredde vil si hele bredden, og enkel vil si 2 nyheter i bredden. For å se hva jeg mener, se her: Link

 

Trenger litt input på hvordan jeg skal lage en metode som printer ut nyhetene korrekt, slik at nyeste kommer øverst, og alle "tomrom" blir fyllt opp. Si at nyeste er lagret slik:

 

- Dobbel(1)

- Enkel(1)

- Dobbel(2)

- Enkel(2)

- Enkel(3)

 

Så vil jeg at de skal printes ut i følgende rekkefølge:

 

- Dobbel(1)

- Enkel(1)

- Enkel(2)

- Dobbel(2)

- Enkel(3)

Lenke til kommentar
Videoannonse
Annonse

Noe slikt du er ute etter..?

 

function
 query1 order by date desc limit 2
 query2 order by date desc limit 3
 for (max 5)
if 1 OR 4
  result[] = fetch query1
else if 2 OR 3 OR 5
  result[] = fetch query2
 return result
end function

 

Ville vært bedre å la en nyhet være både dobbel og enkel, eller enda bedre - gjøre posting av nyhet helt uavhengig av visningsmetode for cms. :p

Lenke til kommentar
Noe slikt du er ute etter..?

 

function
 query1 order by date desc limit 2
 query2 order by date desc limit 3
 for (max 5)
if 1 OR 4
  result[] = fetch query1
else if 2 OR 3 OR 5
  result[] = fetch query2
 return result
end function

 

Ville vært bedre å la en nyhet være både dobbel og enkel, eller enda bedre - gjøre posting av nyhet helt uavhengig av visningsmetode for cms. :p

Du tar spørsmålet ordrett så du linker statisk at pos 1 og 4 skal hentes fra doble og 2, 3 og 5 hentes fra enkle. Poenget var vel at det skal sortes etter nyeste, men hvis det kommer en enkel skal det hentes en enkel til for å fylle ut tomrommet selv om det er noen doble som er nyere.

 

Siden du bare skal ha ca 5 nyheter per side kan du enkelt cache sql resultatet i PHP array og "sortere" dem der.

function sortArrayByType(array $arr)
{
 while(!empty($arr)) {
$out[] = $temp = array_shift($arr);
if (($temp['type'] === 0) && !empty($arr)) {
  foreach ($arr as $k=>$v) {
	if ($v['type'] === 0) {
	  $out[] = $v;
	  unset($arr[$k]);
	  break;
	}
  }
}
//group output nice and easy, return $group instead of $out
//$group[] = $out;
//$out = array();
 }
 return $out;
}

$arr = array(
  array('type' => 1),
  array('type' => 0),
  array('type' => 1),
  array('type' => 0),
  array('type' => 0),
);
$out = sortArrayByType($arr);

print_r($arr);

print_r($out);

 

Kan enkelt modifiseres til å bruke vidde istedenfor enkel/dobbel hvis du skal ha 3+ poster ved siden av hverandre.

Lenke til kommentar
Det ser ut som at algoritmen din ikke fungerer når rekkefølgen endrer seg og når det blir ujevnt forhold mellom enkle og doble.

Eg har ikke klart å gjenta det. Kas rekkefølge gjør at den ikke funker?

 

Og den funker fint med 20+ artikler også.

Endret av OIS
Lenke til kommentar
Slik det ser ut for meg så gjør løsningen din følgende: Dersom siste poppet er type 0, se etter neste type 0, slik at eks. array(1, 0, 0, 0, 1 ) ikke blir sortert. Ideelt burde noe slikt returnere array(1,0,0,1,0).

Det kan selvfølgelig (enkelt) modifiseres slik du foreslår. Men slik eg forstod trådstarter skulle det være i rekkefølge bortsett fra de enkle som ble hentet oppover.

Lenke til kommentar
Slik det ser ut for meg så gjør løsningen din følgende: Dersom siste poppet er type 0, se etter neste type 0, slik at eks. array(1, 0, 0, 0, 1 ) ikke blir sortert. Ideelt burde noe slikt returnere array(1,0,0,1,0).

Det kan selvfølgelig (enkelt) modifiseres slik du foreslår. Men slik eg forstod trådstarter skulle det være i rekkefølge bortsett fra de enkle som ble hentet oppover.

Korrekt

Lenke til kommentar

function orderBy($data, $field) 
{ 
$code = "return strnatcmp(\$a['$field'], \$b['$field']);"; 
usort($data, create_function('$a,$b', $code)); 
return $data; 
} 
$Eksempel = array(array("navn" => "Børre", "tall" => 3), array("navn" => "Johan", "tall" => 1), array("navn" => "Bub", "tall" => 2), array("navn" => "Bob", "tall" => 10));

$Eksempel = orderBy($Eksempel, "tall");
foreach($Eksempel as $var)
{
echo $var['navn']."(".$var['tall'].")<br/>";
}

 

Før:

Børre(3)
Johan(1)
Bub(2)
Bob(10)

Etter:

Johan(1)
Bub(2)
Børre(3)
Bob(10)

Lenke til kommentar
  • 2 uker senere...

Antall spørringer er noe man alltid prøver å holde til et minimum. Å kjøre flere spørringer for å hente ut akkurat samme data er derfor fullstendig uaktuelt. Å kjøre flere spørringer er det som ville være å "blande inn alt annet mulig-rart".

Endret av Jonas
Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...