[PHP] Populatie van array

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Beste tweakers,

ik heb een kleine zoekmachine geschreven, die doorzoekt producten en daaraan gekoppelde tabellen. Werkt allemaal goed, maar ik wil nu de resultaten sorteren op relevantie.

Uiteindelijk komt er voor het sorteren de volgende array uit (bv).
1 1 2 2 2 2 2 3 3 4 4 4 5

Nu zijn dat voor verschillende soorten zoek opdrachten de resultaten, ik ga die natuurlijk unique maken op een gegeven punt (anders krijg je product 1 2x te zien bv), maar die moeten eerst nog gesorteerd worden. Product 2 heeft namelijk de meeste overeenkomsten met mijn zoekterm en komt dus het meeste voor in de sorteer array. Dus eigenlijk wil ik 2 bovenaan, dan 4 dan 1 of 3 en dan 5.

Nu staat me vaag nog iets bij van populatie en daarop sorteren. Ik vind er helaas niet veel over. Kan iemand mijn geheugen verfrissen?

Acties:
  • 0 Henk 'm!

Verwijderd

:?

Gewoon in je query groeperen en dan orderen bij het nummer en de count...
Dus

SQL:
1
SELECT nummer, COUNT(*) AS cnt FROM tabel ORDER BY nummer, cnt GROUP BY nummer

Acties:
  • 0 Henk 'm!

  • _AvA_
  • Registratie: Januari 2006
  • Laatst online: 10:29

_AvA_

en dat ben zo.

The answer is 42...

Wat ga je precies doorzoeken?

Droogkloot.


Acties:
  • 0 Henk 'm!

  • Spockz
  • Registratie: Augustus 2003
  • Laatst online: 10:08

Spockz

Live and Let Live

En waar heb je dan de relevantie opgeslagen staan?

C'est le ton qui fait la musique. | Blog | @linkedin
R8 | 18-55 IS | 50mm 1.8 2 | 70-200 2.8 APO EX HSM | 85 1.8


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Dat is toch niet zo'n heel moeilijk algoritme. Met php gaat dat zo het gemakkelijkst denk ik:
PHP:
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
<?php

$numbers = array(1, 1, 2, 2, 2, 2, 2, 3, 3, 4, 4, 4, 5);
$occurences = array();
foreach ( $numbers as $number )
{
    if ( isset($occurences[$number]) )
    {
        $occurences[$number]++;
    }
    else 
    {
        $occurences[$number] = 1;
    }
}
$uniqueNumbers = array_keys($occurences);
$occurencesPerNumber = array_values($occurences);
array_multisort($occurencesPerNumber, SORT_DESC, SORT_REGULAR, $uniqueNumbers);

var_dump($uniqueNumbers);
/*
array(5) {
  [0]=>
  int(2)
  [1]=>
  int(4)
  [2]=>
  int(1)
  [3]=>
  int(3)
  [4]=>
  int(5)
}
*/

?>

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op vrijdag 17 november 2006 @ 20:10:
:?

Gewoon in je query groeperen en dan orderen bij het nummer en de count...
Dus

SQL:
1
SELECT nummer, COUNT(*) AS cnt FROM tabel ORDER BY nummer, cnt GROUP BY nummer
Het zal me niet verbazen als dit in MySQL werkt, maar in standaard SQL moet de ORDER BY altijd na de GROUP BY komen, en is een ORDER BY cnt (een alias) niet mogelijk. Dat moet dan een ORDER BY 2 (kolomnummer) worden.
Maar dan nog doet jouw query niet wat TS zoekt. Je groepeert op nummer, en sorteert dan eerst op nummer en dan op cnt. Resultaat: je sorteert in feite alleen op nummer. Alleen descending op cnt sorteren zal meer in de richting komen...

Acties:
  • 0 Henk 'm!

Verwijderd

Verwijderd schreef op zaterdag 18 november 2006 @ 00:03:
[...]
Het zal me niet verbazen als dit in MySQL werkt, maar in standaard SQL moet de ORDER BY altijd na de GROUP BY komen, en is een ORDER BY cnt (een alias) niet mogelijk. Dat moet dan een ORDER BY 2 (kolomnummer) worden.
Maar dan nog doet jouw query niet wat TS zoekt. Je groepeert op nummer, en sorteert dan eerst op nummer en dan op cnt. Resultaat: je sorteert in feite alleen op nummer. Alleen descending op cnt sorteren zal meer in de richting komen...
Het idee was lijkt me wel duidelijk... Ik heb die query in 10 secs er neer gedumpt omdat het me zo simpel leek.

Even aanpassen en het werkt dus.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
De data komt niet alleen uit de database! Ik kan dus geen sql gebruiken. Maar zal eens kijken naar het antwoord van Michali kijken, ben nu niet bij die werkgever.

Acties:
  • 0 Henk 'm!

  • PrisonerOfPain
  • Registratie: Januari 2003
  • Laatst online: 26-05 17:08
Michali schreef op vrijdag 17 november 2006 @ 20:15:
Dat is toch niet zo'n heel moeilijk algoritme. Met php gaat dat zo het gemakkelijkst denk ik:
Psst! array_count_values.
PHP:
1
2
3
$array = array_count_values($array);
asort($array);
print_r(array_keys($array));

[ Voor 21% gewijzigd door PrisonerOfPain op 18-11-2006 14:47 ]


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Ja hoor, php weer die overal een functie voor heeft :P Ik had het kunnen weten.

Noushka's Magnificent Dream | Unity

Pagina: 1