| Visa föregående ämne :: Visa nästa ämne |
| Startad av: |
Meddelande |
Mannge
Medlem i: 2742 dagar Från: Stockholm
Status: Offline
#672008
|
Skrivet: 2010-02-08 22:31
Ämne: Multidimensionell array samt sortering
|
|
|
Tjena.
har lite problem med en sak som jag hoppas någon av er därute kan hjälpa mig med,
Jag har en SQL-query där jag hämtar ut ett antal rader genom en while loop. I denna while-loopen räknar jag sen ut ett värde som jag sedan måste sortera listan med. Jag är lite ringrostig på PHP så jag hoppas någon kan hjälpa mig. (det är en för komplicerad uträkning för att lägga in i SQL-satsen).
Detta är vad jag tänkte mig:
Mitt tankesätt:
1. SQL-query
2. while
{
plocka ut ett värde och räkna på det.
spara alla andra värderna samt det nya "sorteringvärde".
}
3. array.sort("sorteringvärde") // sortera efter värdet.
4. kunna skriva ut den sorterade arrayen.
--------
Datan i while loopen:
"kalle","vägen 2", "14"
"nalle","stigen 1","11"
"palle","stigen 4","20"
"falle","vägen 4","17"
Vill kunna lista upp min data i DESC för "sorteringsvärdet", dvs den sista "kolumnen".
Mitt mål:
"palle","stigen 4","20"
"falle","vägen 4","17"
"kalle","vägen 2", "14"
"nalle","stigen 1","11"
Hemskt tacksam för all hjälp jag kan få. Hoppas även ni förstår hur jag tänker.
mvh / Magnus |
|
|
_________________ /....¿ |
| Till toppen på sidan |
|
Trolley
Medlem i: 439 dagar
Status: Offline
#672012
|
Skrivet: 2010-02-08 22:46
Ämne:
|
|
|
| Låt MySQL sortera det åt dig? SELECT * FROM `tabell` ORDER BY `kolumn` DESC, eller missar jag något? |
|
|
|
| Till toppen på sidan |
|
Mannge
Medlem i: 2742 dagar Från: Stockholm
Status: Offline
#672013
|
Skrivet: 2010-02-08 22:49
Ämne:
|
|
|
Dessvärre har du gjort det.
det "sorteringsvärdet" finns inte i databasen utan måste räknas ut med en komplicerad uträkning (som jag verkligen inte vill ens försöka göra i SQL).
Dvs går inte att sortera med ORDER BY.
Utan får först plocka ut all data för att sedan sortera datan i en förslagsvis array, på något vänster.
Tack ändå.. fler förslag?  |
|
|
_________________ /....¿ |
| Till toppen på sidan |
|
Narcisha
Medlem i: 544 dagar
Status: Offline
#672045
|
Skrivet: 2010-02-09 05:22
Ämne:
|
|
|
Hejsan, använd följande funktion (först exempel, sedan funktion, obviously ;P) Det fungerar som en helt vanlig order by, fast i en array.
1: <?php 2: $array[0]['data'] = 'hihi'; 3: $array[0]['sort'] = 1; 4: $array[1]['data'] = 'hej'; 5: $array[1]['sort'] = 2; 6: orderBy($array, 'sort DESC'); 7: print_r($array); 8: ?>
|
1: <?php 2: if ( ! function_exists('orderBy')) 3: { 4: function orderBy(&$ary, $clause, $ascending = true) 5: { 6: $clause = str_ireplace('order by', '', $clause); 7: $clause = preg_replace('/\s+/', ' ', $clause); 8: $keys = explode(',', $clause); 9: $dirMap = array('desc' => 1, 'asc' => -1); 10: $def = $ascending ? -1 : 1; 11: 12: $keyAry = array(); 13: $dirAry = array(); 14: foreach($keys as $key) { 15: $key = explode(' ', trim($key)); 16: $keyAry[] = trim($key[0]); 17: if(isset($key[1])) { 18: $dir = strtolower(trim($key[1])); 19: $dirAry[] = $dirMap[$dir] ? $dirMap[$dir] : $def; 20: } else { 21: $dirAry[] = $def; 22: } 23: } 24: 25: $fnBody = ''; 26: for($i = count($keyAry) - 1; $i >= 0; $i--) { 27: $k = $keyAry[$i]; 28: $t = $dirAry[$i]; 29: $f = -1 * $t; 30: $aStr = '$a[\''.$k.'\']'; 31: $bStr = '$b[\''.$k.'\']'; 32: if(strpos($k, '(') !== false) { 33: $aStr = '$a->'.$k; 34: $bStr = '$b->'.$k; 35: } 36: 37: if($fnBody == '') { 38: $fnBody .= "if({$aStr} == {$bStr}) { return 0; }\n"; 39: $fnBody .= "return ({$aStr} < {$bStr}) ? {$t} : {$f};\n"; 40: } else { 41: $fnBody = "if({$aStr} == {$bStr}) {\n" . $fnBody; 42: $fnBody .= "}\n"; 43: $fnBody .= "return ({$aStr} < {$bStr}) ? {$t} : {$f};\n"; 44: } 45: } 46: 47: if($fnBody) { 48: $sortFn = create_function('$a,$b', $fnBody); 49: usort($ary, $sortFn); 50: } 51: } 52: } 53: ?>
|
|
|
|
|
| Till toppen på sidan |
|
EmilV


Medlem i: 2807 dagar Från: Upplands Väsby
Status: Offline
#672046
|
Skrivet: 2010-02-09 05:37
Ämne:
|
|
|
array_multisort ska kunna göra just det du är ute efter. Personligen tycker jag syntaxen verkar lite rörig (säkert för att jag inte orkat sätta mig in i funktionen), så jag brukar alltid använda usort i sådana här lägen.
Om du använder usort kan du i princip använda exemplet i manualen rakt av. Det du måste ändra är att du har en viss kolumn du vill jämföra på, så här:
1: 2: function my_cmp($a, $b) { 3: if($a[2] == $b[2]) { 4: return 0; 5: } 6: return ($a[2] < $b[2]) ? -1 : 1; 7: } 8: 9: usort($din_array, 'my_cmp'); 10:
|
Edit: Uppenbart fel på sista raden. Pinsamt.
Senast ändrad av EmilV den 2010-02-09 09:44, ändrad totalt 1 gång |
|
|
_________________ Tänk!
Levonline webbhotell, egen server och VPS | EmilVikström.se |
| Till toppen på sidan |
|
Mannge
Medlem i: 2742 dagar Från: Stockholm
Status: Offline
#672052
|
Skrivet: 2010-02-09 09:21
Ämne:
|
|
|
| stort tack för hjälpen. skall prova så fort jag kommer hem ifrån jobbet. |
|
|
_________________ /....¿ |
| Till toppen på sidan |
|
Mannge
Medlem i: 2742 dagar Från: Stockholm
Status: Offline
#672204
|
Skrivet: 2010-02-10 20:42
Ämne:
|
|
|
Fungerade klockrent.
stort tack Narcisha! |
|
|
_________________ /....¿ |
| Till toppen på sidan |
|
|