qualitum logo
Multidimensionell array samt sortering

PHPportalen Forum Index » PHP
Lägg ett bokmärke på hela tråden
Skapa nytt inlägg   Svara på inlägget
Visa föregående ämne :: Visa nästa ämne  
Startad av: Meddelande
Mannge



Medlem i: 2742 dagar
Från: Stockholm
Status: Offline



#672008
Inlägg Skrivet: 2010-02-08 22:31      Ämne: Multidimensionell array samt sortering Citera

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

mvh / Magnus
 

_________________
/....¿
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Visa skript som användaren har laddat upp
Trolley



Medlem i: 439 dagar

Status: Offline



#672012
Inlägg Skrivet: 2010-02-08 22:46      Ämne: Citera

Låt MySQL sortera det åt dig? SELECT * FROM `tabell` ORDER BY `kolumn` DESC, eller missar jag något?
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Visa skript som användaren har laddat upp
Mannge



Medlem i: 2742 dagar
Från: Stockholm
Status: Offline



#672013
Inlägg Skrivet: 2010-02-08 22:49      Ämne: Citera

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

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? Wink
 

_________________
/....¿
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Visa skript som användaren har laddat upp
Narcisha



Medlem i: 544 dagar

Status: Offline



#672045
Inlägget är accepterad som det rätta svaret Skrivet: 2010-02-09 05:22      Ämne: Citera

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.
PHP:
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:
?>


PHP:
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
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 = -$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
Visa användarprofil Skicka privat meddelande Visa skript som användaren har laddat upp Skicka e-post
EmilV
Moderator



Medlem i: 2807 dagar
Från: Upplands Väsby
Status: Offline



#672046
Inlägg Skrivet: 2010-02-09 05:37      Ämne: Citera

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:
PHP:
1:
 
2:
function my_cmp($a$b) {
3:
    if($a[2] == $b[2]) {
4:
        return 0;
5:
    }
6:
    return ($a[2] < $b[2]) ? -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
Visa användarprofil Skicka privat meddelande Visa skript som användaren har laddat upp Besök användarens hemsida
Mannge



Medlem i: 2742 dagar
Från: Stockholm
Status: Offline



#672052
Inlägg Skrivet: 2010-02-09 09:21      Ämne: Citera

stort tack för hjälpen. skall prova så fort jag kommer hem ifrån jobbet.
 

_________________
/....¿
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Visa skript som användaren har laddat upp
Mannge



Medlem i: 2742 dagar
Från: Stockholm
Status: Offline



#672204
Inlägg Skrivet: 2010-02-10 20:42      Ämne: Citera

Fungerade klockrent.

stort tack Narcisha!
 

_________________
/....¿
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Visa skript som användaren har laddat upp
Visa tidigare inlägg:   
Skapa nytt inlägg   Svara på inlägget
PHPportalen Forum Index » PHP
Hoppa till:  
Du kan inte skapa nya inlägg i det här forumet
Du kan inte svara på inlägg i det här forumet
Du kan inte ändra dina inlägg i det här forumet
Du kan inte ta bort dina inlägg i det här forumet
Du kan inte rösta i det här forumet
Du kan inte bifoga filer i detta forum
Du kan inte ladda ner filer från detta forum
Kontakta oss på adressen: info@phpportalen.net
Webbplatsen bygger i grunden på phpBB © 2001, 2002 phpBB Group

Modifieringar har senare gjorts i systemet av PHPportalen
Sid och logotypdesign skapad av Daren Jularic
qualitum logo