oya Skrevet 7. februar 2009 Del Skrevet 7. februar 2009 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
tickinghd Skrevet 8. februar 2009 Del Skrevet 8. februar 2009 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. Lenke til kommentar
OIS Skrevet 8. februar 2009 Del Skrevet 8. februar 2009 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. 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
tickinghd Skrevet 8. februar 2009 Del Skrevet 8. februar 2009 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. Lenke til kommentar
oya Skrevet 8. februar 2009 Forfatter Del Skrevet 8. februar 2009 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. Lenke til kommentar
OIS Skrevet 9. februar 2009 Del Skrevet 9. februar 2009 (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 9. februar 2009 av OIS Lenke til kommentar
tickinghd Skrevet 9. februar 2009 Del Skrevet 9. februar 2009 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). Lenke til kommentar
OIS Skrevet 9. februar 2009 Del Skrevet 9. februar 2009 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
oya Skrevet 11. februar 2009 Forfatter Del Skrevet 11. februar 2009 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
DoraB Skrevet 11. februar 2009 Del Skrevet 11. februar 2009 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
itsmebth Skrevet 11. februar 2009 Del Skrevet 11. februar 2009 Hva med å lese tråden før du svarer? Lenke til kommentar
TheClown Skrevet 25. februar 2009 Del Skrevet 25. februar 2009 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 Lenke til kommentar
Jonas Skrevet 25. februar 2009 Del Skrevet 25. februar 2009 (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 25. februar 2009 av Jonas Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå