Array sorteren op natuurlijkewijze reverse

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Rein de Vries

Rein de Vries

21/01/2009 17:03:00
Quote Anchor link
Hello,

ik heb een vraag, ik heb in mijn database 2 tabellen;
1 voor artikelen
1 voor columns

in de tabel is een veld aangemaakt die bijhoudt hoeveel keer het artikel is bekeken.

Het is nu de bedoeling om die 2 tabellen samen te voegen en daarvan de top 5 van de meest bekeken artikelen te laten zien(van columns en artikelen)

om dit te doen heb ik eerst columns en daarna artikelen uitgelezen en daarvan alle waardes in een array gezet met de volgende waarde per keer:"aantal keer bekeken, het id nr, veld naam, tabel naam".

daarna heb ik de array gesorteerd met een gemaakte natsort() functie
rnatsort()

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?PHP
function rnatsort($a){
    natsort($a);
    $a = array_reverse($a, true);
}

?>


daarna ben ik alles gaan uitdraaien zoals je hieronder verder kunt zien.

mijn vraag/probleem is:
als ik net na de functie rnatsort() een foreach van de array doe, dan zie ik dat de hoogst aantal bekeken boven aan staat.
maar zodra het allemaal door de for lus gaat dan sorteerd hij ineens heel anders en pakt hij eerst de hoogste van artikelen en daarna die van columns wat niet zou moeten.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
<?PHP
$most_read
= array();

//alles selecteren uit de db artikelen
$q = "SELECT * FROM artikelen ORDER BY artikelen_bekeken DESC";
$r = mysql_query($q);
while($artikelen = mysql_fetch_object($r)){
    $most_read[] = $artikelen->artikelen_bekeken." ".$artikelen->artikelen_id." artikelen_id artikelen";
}

unset($q);
unset($r);

//alles selecteren uit de db collumns
$q = "SELECT * FROM collumns ORDER BY column_bekeken DESC";
$r = mysql_query($q);
while($column = mysql_fetch_object($r)){
    $most_view[] = $column->column_bekeken." ".$column->column_id." column_id collumns";
}

unset($q);
unset($r);

//sorteren van  de array op datum
rnatsort($most_read);


//beginnen met de lus te maken
for($i=0; $i<5; $i++){

    //de variabelen aanmaken zodat ze erlke keer op NULL staan
    $tmp_array = array();
    $item = "";
    $q = "";
    $r = "";
    $qq = "";
    $rr = "";
    //alles voor de zekerheid unsetten zodat het echt leeg is!
    unset($tmp_array);
    unset($item);
    unset($q);
    unset($r);
    unset($qq);
    unset($rr);
    
    //1 record uit de array $most_read naar 1 array gooien
    $tmp_array = explode(" ", $most_read[$i]);
    
    //beginnen met de opdracht voor de database
    $q = "SELECT * FROM ".$tmp_array[3]." WHERE ".$tmp_array[2]." = ".$tmp_array[1];
    $r = mysql_query($q) or die(mysql_error());
    $item = mysql_fetch_object($r);
    
    //if else lus maken voor de columns en de artikelen
    if($tmp_array[3] == "collumns"){
        echo "<div class=\"last_article_view_teller\">".$teller.".</div>";
        echo "<div class=\"last_article_view\">";
        echo "<a href=\"?page=column&amp;columnid=".$item->column_id."\">".substr($item->column_titel, 0, 15)."...</div>\n";
        echo "<div class=\"spacer\"></a></div>\n";
    }

    else{
        echo "<div class=\"last_article_view_teller\">".$teller.".</div>";
        echo "<div class=\"last_article_view\">";
        echo "<a href=\"?page=artikelen&amp;artid=".$item->artikelen_id."\">".substr($item->artikelen_titel, 0, 15)."...</div>\n";
        echo "<div class=\"spacer\"></a></div>\n";
    }
}

?>
Gewijzigd op 01/01/1970 01:00:00 door Rein de Vries
 
PHP hulp

PHP hulp

02/02/2023 02:05:49
 
Eddy E

Eddy E

21/01/2009 17:05:00
Quote Anchor link
Dat kan veeeeel beter gewoon direct in de database.
Dan blijft het ook up to date en is het veel sneller.

Dit wordt dus iets van een INNER JOIN of zoiets, maar ga dit aub wel in SQL doen ipv PHP.
 
Rein de Vries

Rein de Vries

21/01/2009 17:28:00
Quote Anchor link
een join kan ik niet gebruiken omdat de tabellen geen overeenkomsten hebben
ofwel?
 
Eddy E

Eddy E

21/01/2009 18:41:00
Quote Anchor link
Zei u niet ... in de tabel is een veld aangemaakt die bijhoudt hoeveel keer het artikel is bekeken. ???

Je selecteerd dus 3 dingen: aantal_reviews; artikel_id; column_id.
Die sorteer je op aantal_reviews (of hoe je het ook noemt) en dan kijk je wel id WEL gevuld is... als dat artikel_id is, dan is het een artikel (en heb je gelijk het ID ervan, is het column_id, dan is het een column ;).

Eventueel kan het ook een OUTER JOIN worden, maar dat is even kijken.
Ga eerst maar eens lekker spelen in je admin (bijvoorbeeld phpMyAdmin).

Ps... volgens mij kan met JOIN ook koppelen op aliassen.

Dus:
SELECT artikel_id AS id, column_id AS id, aantal_views AS views
FROM ...
ORDER BY views
LIMIT 0, 5
Gewijzigd op 01/01/1970 01:00:00 door Eddy E
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.