Gå til innhold

Lager cms: Hvordan sortere visning av nyheter


Anbefalte innlegg

Skrevet

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)

Videoannonse
Annonse
Skrevet

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

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

Skrevet

5 var bare et eksempel. Ser for meg kanskje 20 nyheter, men må fungere med forskjellig antall. Uansett, takk for svar, fikk en del ideer om hvordan jeg skal gjøre det.

Skrevet (endret)
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
Skrevet

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

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

Skrevet
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

Skrevet

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)

  • 2 uker senere...
Skrevet

Kan du ikke bare kjøre flere separate spørringer?

 

SELECT nyeste dobbel

SELECT 2 nyeste enkel

SELECT nest nyeste dobbel

SELECT 3 nyeste enkel

 

Burde ikke være vanskligere enn det, istede for å blande inn alt annet mulig-rart

Skrevet (endret)

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

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