[php] sorteren variabelen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • twisted2000
  • Registratie: Januari 2004
  • Laatst online: 05-03-2021
heb een zoekfunctie gemaakt en hij werkt bijna alleen zit ik nog met 1 probleem. Het aantal overeenkomende zoekresultaten moet ik per uitkomst tellen en dan sorteren op volgorde. Aangezien de uitkomsten in een while lus komen weet ik dus niet hoe ik daarin kan sorteren. Hier is mn code:

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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<? 
include("include/php/db.inc.php"); 
$zoek2 = strtolower($_REQUEST['search']); 
$zoek2 = explode(" ",$zoek2); 

$like = "";  
$count = "";   
foreach($zoek2 as $zoek3)  { 
    //dus hier gaan we eerst het like gedeelte compleet maken 
    if ($like <> "") { 
        $like = "$like OR content LIKE '%$zoek3%'"; 
    } 
    else { 
        $like = "LIKE '%$zoek3%'"; 
    }
    if ($count <> "") { 
        $count = "$count, $zoek3"; 
    } 
    else { 
        $count = "$zoek3"; 
    }    
} 
 echo "<TR><TD colspan=2>U heeft gezocht naar: " . $count . "</TD></TR>";
 echo "<TR><TD>&nbsp;</TD><TD>&nbsp;</TD></TR>";
 echo "<TR><TD>Artikel</TD><TD>score</TD></TR>";
 echo "<TR><TD colspan=2><hr color=#FFFFFF size=1 align=center></TD></TR>";
  
if ($like <> "") { 
   //kleine beveiliging voor als er niks is ingevult   
   $qry = "SELECT name, content FROM artikel WHERE content $like"; 
   $result = mysql_query($qry) or die("Verbinding mislukt."); 
   while ($row = mysql_fetch_array($result)) { 
   
        $name = strtolower($row["name"]);
        $content = strtolower($row["content"]);
        
        $count2 = explode (", ", $count);
        $n = ""; 
        foreach($count2 as $count3) {
        if ($n <> "") { 
        $n = $n + count(explode($count3,$content)) - 1;
    } 
    else { 
       $n = count(explode($count3,$content)) - 1; 
    }
    }
       echo "<TR><TD>" . $name . "</TD><TD align=left>Score:" .$n . "</TD></TR>"; 
} 
}
?>


Het gaat met name dus hoe ik de var $n op nummer kan sorteren van hoog naar laag. Is het daarbij ook mogelijk om het hoogste aantal in een variabele vast te leggen?
Alvast bedankt.

Acties:
  • 0 Henk 'm!

  • Kees
  • Registratie: Juni 1999
  • Laatst online: 11:10

Kees

Serveradmin / BOFH / DoC
Niet meteen printen, maar in plaats van echo "<tr><td>$name<...>$n" doe je iets als
PHP:
1
2
3
4
$artikel[$name] = $n
//lus uit laten lopen, $artikel sorteren, artikel printen
while (list($name, $n) = each($artikel)) 
    echo "<tr><td>$name</td><td align=left>Score: $n</td></tr>";
hoe een array te sorteren (zodat je key-val ook nog klopt) staat wel in de php manual

[ Voor 3% gewijzigd door Kees op 06-11-2004 11:07 . Reden: pest html rechten ]

"Een serveradmin, voluit een serveradministrator, is dan weer een slavenbeheerder oftewel een slavendrijver" - Rataplan


Acties:
  • 0 Henk 'm!

  • twisted2000
  • Registratie: Januari 2004
  • Laatst online: 05-03-2021
dat werkt nu idd goed,
hij sorteerd alles alleen krijg ik niet de naam van het artikel ervoor, hij geet dan gewoon 1, 2, 3 enzo op als naam waarop hij sorteerd --> $key

Hoe kan ik die key veranderen naar de naam van het artikel uit de db waar die waarde bij hoort?

dit is mn code:

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

if ($like <> "") { 
   //kleine beveiliging voor als er niks is ingevult   
   $qry = "SELECT name, content FROM artikel WHERE content $like"; 
   $result = mysql_query($qry) or die("Verbinding mislukt."); 
   while ($row = mysql_fetch_array($result)) { 
   
        $name = strtolower($row["name"]);
        $content = strtolower($row["content"]);
        
        $count2 = explode (", ", $count);
        $n = ""; 
        foreach($count2 as $count3) {
        if ($n <> "") { 
        $n = $n + count(explode($count3,$content)) - 1;
    } 
    else { 
       $n = count(explode($count3,$content)) - 1; 
    }
    }
      $artikel[$name] = $n;
    } 
rsort($artikel);
reset($artikel);

while (list($key, $val) = each($artikel)) 

    echo "<tr><td>$key</td><td align=left>Score: $val\n</td></tr>";

}

?>


en als ik ipv $key $name invul krijg ik logischerwijs alleen de laatste entry uit de database die hij overal weergeeft

[ Voor 14% gewijzigd door twisted2000 op 06-11-2004 12:22 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Kees schreef op 06 november 2004 @ 11:06:
hoe een array te sorteren (zodat je key-val ook nog klopt) staat wel in de php manual
mbv sort, rsort, asort, arsort, ksort of krsort dus..

[ Voor 6% gewijzigd door Verwijderd op 06-11-2004 12:22 . Reden: krsort vergeten ]


Acties:
  • 0 Henk 'm!

  • twisted2000
  • Registratie: Januari 2004
  • Laatst online: 05-03-2021
heb het nu zo:

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
if ($like <> "") { 
   //kleine beveiliging voor als er niks is ingevult   
   $qry = "SELECT name, content FROM artikel WHERE content $like"; 
   $result = mysql_query($qry) or die("Verbinding mislukt."); 
   while ($row = mysql_fetch_array($result)) { 
   
        $name = strtolower($row["name"]);
        $content = strtolower($row["content"]);
        
        $count2 = explode (", ", $count);
        $n = ""; 
        foreach($count2 as $count3) {
        if ($n <> "") { 
        $n = $n + count(explode($count3,$content)) - 1;
    } 
    else { 
       $n = count(explode($count3,$content)) - 1; 
    }
    }
      $artikel[$name] = $n;
      $artikel2[] = $name;
    } 
    
rsort($artikel);
reset($artikel);

while ((list($key, $val) = each($artikel)) && (list($key2, $val2) = each($artikel2))) 

    echo "<tr><td>" . $val2 . "</td><td align=left>Score:" . $val . "</td></tr>";

}

?>


alleen dan doet hij $name ook op alpha volgorde sorteren en klopt het dus niet meer watn staan de waardes van $n bij de verkeerde namen van $name...weet wel hoe dat komt maar weet niet hoe dat op te lossen |:(


en als ik het zo doe:

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
if ($like <> "") { 
   //kleine beveiliging voor als er niks is ingevult   
   $qry = "SELECT name, content FROM artikel WHERE content $like"; 
   $result = mysql_query($qry) or die("Verbinding mislukt."); 
   while ($row = mysql_fetch_array($result)) { 
   
        $name = strtolower($row["name"]);
        $content = strtolower($row["content"]);
        
        $count2 = explode (", ", $count);
        $n = ""; 
        foreach($count2 as $count3) {
        if ($n <> "") { 
        $n = $n + count(explode($count3,$content)) - 1;
    } 
    else { 
       $n = count(explode($count3,$content)) - 1; 
    }
    }
      $artikel[$name] = "<tr><td>" . $name . "</td><td align=left>Score:" . $n . "</td></tr>";
    } 
    
rsort($artikel);
reset($artikel);

while (list($key, $val) = each($artikel)) 

    echo $val;

}

?>


dan sorteerd ie op $name ipv $n.....

[ Voor 35% gewijzigd door twisted2000 op 06-11-2004 12:46 ]


Acties:
  • 0 Henk 'm!

Verwijderd

twisted2000 schreef op 06 november 2004 @ 12:44:
en als ik het zo doe:

PHP:
1
//code


dan sorteerd ie op $name ipv $n.....
Vrij logisch, want je gebruikt de variabele $name als key voor je array.
Als je als key nou eens de score gebruikt?
Let er dan wel op dat het resultaat meerdere waarden kan bevatten met dezelde score en dat je die elkaar niet laat overschrijven.

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
37
38
39
40
41
42
43
44
45
if ($like <> "")
{ 
    //kleine beveiliging voor als er niks is ingevult    
    echo $qry = "SELECT name, content FROM artikel WHERE content $like"; 
    echo '<br><br>';
    $result = mysql_query($qry) or die("Verbinding mislukt."); 
    while ($row = mysql_fetch_array($result))
    { 
    
        $name = strtolower($row["name"]); 
        $content = strtolower($row["content"]); 
         
        $count2 = explode (", ", $count); 
        $n = ""; 
        foreach($count2 as $count3)
        { 
            
            if ($n <> "")
            { 
                $n = $n + count(explode($count3,$content)) - 1; 
            } else
            { 
                $n = count(explode($count3,$content)) - 1; 
            } 
        } 
      
        $artikel[$n][] = "<tr><td>" . $name . "</td><td align=left>Score:" . $n . "</td></tr>"; 
    } 
     
    rsort($artikel); 
    reset($artikel); 

    foreach($artikel AS $artikelen_met_dezelfde_score_array)
    {

        foreach($artikelen_met_dezelfde_score_array AS $waarde)
        {

            echo $waarde.'<br>';

        }

    }

}

[ Voor 37% gewijzigd door Verwijderd op 06-11-2004 13:33 ]


Acties:
  • 0 Henk 'm!

  • twisted2000
  • Registratie: Januari 2004
  • Laatst online: 05-03-2021
heb het zo gedaan, is wel niet echt mooi maar voorlopig werkt het tenminste even;

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
37
38
39
if ($like <> "") { 
   //kleine beveiliging voor als er niks is ingevult   
   $qry = "SELECT name, content FROM artikel WHERE content $like"; 
   $result = mysql_query($qry) or die("Verbinding mislukt."); 
   while ($row = mysql_fetch_array($result)) { 
   
        $name = strtolower($row["name"]);
        $content = strtolower($row["content"]);
        
        $count2 = explode (", ", $count);
        $n = ""; 
        foreach($count2 as $count3) {
        if ($n <> "") { 
        $n = $n + count(explode($count3,$content)) - 1;
    } 
    else { 
       $n = count(explode($count3,$content)) - 1; 
    }
    }
      $p = $n;
      $artikel[$n] = "<!--" . $p . "--><tr> <td>" . $name. "</td><td align=left>Score:". $n . "</td></tr>" ;

    
    
rsort($artikel);
reset($artikel);


} 

while (list($key, $val) = each($artikel))


    echo  $val;
    

}

?>


weet iemand toevallig hoe ik die $p kan exploden ipv een aantekening dervan te maken zodat je hem neit ziet

[ Voor 18% gewijzigd door twisted2000 op 06-11-2004 15:01 ]


Acties:
  • 0 Henk 'm!

Verwijderd

[NOFI]
Blijkbaar is onderstaande boodschap, quote van mezelf overigens, niet helemaal doorgedrongen. Kijk nog eens goed naar je eigen code en naar die van mij zou ik zeggen- de code die jij nu gebruikt is niet juist als er meerdere resultaten zijn waarvan de scores ($n) hetzelfde zijn.
[/NOFI]
Verwijderd schreef op 06 november 2004 @ 13:33:
[...]
Let er dan wel op dat het resultaat meerdere waarden kan bevatten met dezelde score en dat je die elkaar niet laat overschrijven.

Acties:
  • 0 Henk 'm!

  • Guldan
  • Registratie: Juli 2002
  • Laatst online: 21-09 11:30

Guldan

Thee-Nerd

je kan beter voor:

PHP:
1
2
3
4
if ($like <> "")
{
etc...
}

PHP:
1
2
3
4
if (isset($like)) 
{
//plaats hier je code
}

gebruiken. Is makkelijker en veiliger dan kijken of hij leeg is.

[ Voor 54% gewijzigd door Guldan op 06-11-2004 19:51 ]

You know, I used to think it was awful that life was so unfair. Then I thought, wouldn't it be much worse if life were fair, and all the terrible things that happen to us come because we actually deserve them?


Acties:
  • 0 Henk 'm!

  • pjotrk
  • Registratie: Mei 2004
  • Laatst online: 15-07 18:43
Aantal als sleutel gebruiken lijkt me niet zo handig zoals ivy al aangeeft.
Met arsort kan je een array op waarde sorteren, met behoud van de key.

Verder ben ik verder gegaan met de oplossing die ik in het vorige topic heb gegeven.
[rml][ php] zoekfunctie in php[/rml]

Verder zou ik de zoekzin uitelkaar halen met een reguliere expressie, omdat een dubbele spatie bij explode(" ",$zoek2); een leeg array item opleverd en er dus voor zorgt dat er gezocht wordt op '%%' (wat dus in al je artikelen terug komt).

(niet getest, maar zou moeten werken in principe)
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
37
38
39
40
<?
include("include/php/db.inc.php");
$searchString = trim(strtolower($_REQUEST['search']));

if (!empty($searchString)) //kleine beveiliging voor als er niks is ingevult
{
    //preg_split ipv explode om lege array items te voorkomen
    $searchWords = preg_split("/ +/", $searchString);

    //hier gaan we eerst het like gedeelte compleet maken
    $likeParts = preg_replace("/(\S+)/", "content LIKE '%\\1%'", $searchWords)
    $like = implode(" OR " , $likeParts);

    // haal zoek resultaten op
    $qry = "SELECT name, content FROM artikel WHERE " . $like . " ORDER BY id";
    $result = mysql_query($qry) or die("Verbinding mislukt.");
    
    // tel zoekaantallen en sorteer array
    $wordCounts = array();
    while ($row = mysql_fetch_array($result))
    {
        $artikelNaam = $row['name'];
        $artikelContent = strtolower( $row['content'] );
        foreach($searchWords as $searchWord)
        {
            $wordCounts[$artikelNaam] = substr_count($artikelContent, $searchWord);
        }
    }
    arsort($wordCounts);

    echo "Gezocht naar: " . implode ( ", " , $searchWords) . "<BR>";
    echo "<table>\n";
    echo "<tr><td>Artikel</td><td>score</td></tr>\n";
    foreach ($wordCounts as $artikelNaam=>$wordCount)
    {
        echo "<tr><td>" . $artikelNaam . "</td><td>" . $wordCount . "</td></tr>\n";
    }
    echo "</table>\n";
}
?>

[ Voor 29% gewijzigd door pjotrk op 07-11-2004 03:16 . Reden: Bedacht ineens dat voor het samenstellen van het like deel nieteens een lusje nodig is :P ]


Acties:
  • 0 Henk 'm!

Verwijderd

dat ziet er netjes uit :)
Pagina: 1