[PHP] Alfabetische overzicht

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Huidige situatie:

Ik zal jullie eerst een overzicht huidige gang van zaken geven.

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
<?php 
include ("config.php");

$query = "SELECT * FROM collectie ORDER BY titel";    
$info =mysql_query($query) or die ("Lezen gegevens mislukt.");


echo "<table width=\"600\" border=\"0\" align=\"center\" cellpadding=\"0\" cellspacing=\"0\">
      <tr>
       <td class=\"titel\">Overzicht collectie</td>
       <td class=\"button\"><a href=\"add.php\" class=\"link\">toevoegen</td>
      </tr>
      <tr>
       <td colspan=\"2\"><hr></td>
      </tr>"; 

while ($gegeven = mysql_fetch_object($info)) {
$id = $gegeven->id;
$titel = $gegeven->titel;

echo "<tr>
       <td colspan=\"2\"><a href=\"info.php?id=$id\" class=\"link\">$titel</a></td>
      </tr>"; 
}

echo "<tr>
        <td colspan=\"2\"><hr></td>
       </tr>
</table>";
?>


Gewenste situatie:

Wat ik graag wil is bijna hetzelfde als wat hier boven staat maar nu wil ik het graag gesorteerd met begin letter en dan een witregel.

Dus:
A (alle titels wat met een A begint)
Titels
(witregel)
B (alle titels wat met een B begint)
Titels
(witregel)

Nu heb ik al even gegoogled en de GOT search gebruikt maar niets gevonden wat ik eigenlijk wil. Het gene wat er nog het dichste bij komt is Topic 845991

Acties:
  • 0 Henk 'm!

  • Snow_King
  • Registratie: April 2001
  • Laatst online: 17:19

Snow_King

Konijn is stoer!

Kan je niet alle letters in een array stoppen dan vervolgens voor elke enrty van de array

SELECT * FROM collectie WHERE titel LIKE '$letter%' die SQL querie uitvoeren?

Acties:
  • 0 Henk 'm!

  • Config
  • Registratie: Januari 2000
  • Laatst online: 06-01 00:49
Er is een functie in mysql voor de eerste letter van een string. Zoek maar ff op in de manual. Het zal vele malen sneller zijn dan die LIKE '" . $sLetter . "%' optie..

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
zal eens kijken of ik dat voor elkaar kan krijgen. In ieder geval bedankt.....

Acties:
  • 0 Henk 'm!

Verwijderd

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// init
$data = array('aap', 'beer', 'brood', 'dik', 'fluit', 'fanatiek', 'graag', 'huis');

// echo
for($i=0;$i<count($data);$i++)
{

    if($i == 0 OR substr($data[$i],0,1) != $oldHeader)
      echo '<b>' . substr($data[$i],0,1) . '</b><br>';

    echo $data[$i] . '<br>';

    $oldHeader = substr($data[$i],0,1);

}


:Y)

Qua commentaar; wat TS wil heeft toch helemaal niets met SQL of queries te maken?! Gaat toch om de dataverwerking en niet om het ophalen?

[ Voor 83% gewijzigd door Verwijderd op 10-04-2004 11:28 ]


Acties:
  • 0 Henk 'm!

  • Snow_King
  • Registratie: April 2001
  • Laatst online: 17:19

Snow_King

Konijn is stoer!

Verwijderd schreef op 10 april 2004 @ 11:24:

:Y)

Qua commentaar; wat TS wil heeft toch helemaal niets met SQL of queries te maken?! Gaat toch om de dataverwerking en niet om het ophalen?
Tuurlijk wel om het ophalen, hij moet ze toch ook per letter sorteren?
Dus eerst alles wat begint met een A ophalen, dan een B.

Wel zonde krijg je 26 SQL queries ;(

Acties:
  • 0 Henk 'm!

Verwijderd

Snow_King schreef op 10 april 2004 @ 11:37:
[...]


Tuurlijk wel om het ophalen, hij moet ze toch ook per letter sorteren?
Dus eerst alles wat begint met een A ophalen, dan een B.

Wel zonde krijg je 26 SQL queries ;(
Met je eens dat er gesorteerd moet worden, echter dit gebeurd natuurlijk al met de toevoeging:

PHP:
1
2
... ORDER BY titel 
// eventueel ASC of DESC


Hierna is het zaak om te controleren wat de eerste letter is en of deze binnen een 'nieuwe groep' valt.. 26 queries zijn in ieder geval far beyond the necessary...

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 21-09 14:28
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php 
//ongetest maar het idee mag duidelijk zijn hoop ik
include ("config.php"); 

$query = "SELECT titel FROM collectie ORDER BY titel";     
$info =mysql_query($query) or die ("Lezen gegevens mislukt."); 

$lastletter='';
while ($gegeven = mysql_fetch_assoc($info)) { 
  if($lastletter!=substr($gegeven['titel'], 0, 1)){
    $lastletter=substr($gegeven['titel'], 0, 1);
    echo '<hr>'.$lastletter;
  }  

  echo $gegeven['titel'].'<br>';
}
?>


Een FAQ over deze werkwijze: http://www.yapf.net/faq.php?cmd=2&itemid=778

[ Voor 41% gewijzigd door djluc op 10-04-2004 11:45 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Nou, dat zijn twee (nagenoeg indentieke :? ...) hap-klare oplossingen. Wat wil een mens nog meer op de zaterdagochtend?

Acties:
  • 0 Henk 'm!

  • Snow_King
  • Registratie: April 2001
  • Laatst online: 17:19

Snow_King

Konijn is stoer!

* Snow_King slaps himself 8)7

Ik wilde voor elke letter een query gaan doen :X

[ Voor 11% gewijzigd door Snow_King op 10-04-2004 11:48 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Snow_King schreef op 10 april 2004 @ 11:47:
* Snow_King slaps himself 8)7

Ik wilde voor elke letter een query gaan doen :X
In ieder geval goed dat je nu zelf inziet dat dát niet nodig is... ;)

Acties:
  • 0 Henk 'm!

  • Jurgen
  • Registratie: September 2003
  • Laatst online: 05-09 20:22
als je alles in een array dumpt en dan met sort() zet ie alles op alfabetische volgorde kan je met een simpele backup variabele controleren of er een nieuwe beginletter is en dan kan je eventueel een witregel geven.

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 21-09 14:28
Backup variablen, wat zijn dat?
Verder vertel je eigenlijk enkele uren later wat Ivy met zijn array en ik met mijn databaseresultaten doe, wat is het nut van je post?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Nogmaals hartelijk dank voor jullie post. Ik kan zo wel weer verder. _/-\o_

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb nog even vraag over mijn eerste vraag. Nu ben ik wat verder met het ontwikkelen van me site. Er komen ook steeds meer dvd's bij die beginnen met een cijfer of iets anders. Wanneer ik onderstaand gebruik komen die ook allemaal gegroepeerd.
djluc schreef op 10 april 2004 @ 11:43:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php 
//ongetest maar het idee mag duidelijk zijn hoop ik
include ("config.php"); 

$query = "SELECT titel FROM collectie ORDER BY titel";     
$info =mysql_query($query) or die ("Lezen gegevens mislukt."); 

$lastletter='';
while ($gegeven = mysql_fetch_assoc($info)) { 
  if($lastletter!=substr($gegeven['titel'], 0, 1)){
    $lastletter=substr($gegeven['titel'], 0, 1);
    echo '<hr>'.$lastletter;
  }  

  echo $gegeven['titel'].'<br>';
}
?>


Een FAQ over deze werkwijze: http://www.yapf.net/faq.php?cmd=2&itemid=778
Dat is iets wat ik nu eigenlijk niet wil, ben er nu al een tijdje mee bezig maar krijg het niet voorelkaar. Wat ik wil is dat wanneer een titel van een dvd begint met iets anders dan een letter moet deze titel in de groep # geplaatst worden.

Wie kan mij helpen.....

Acties:
  • 0 Henk 'm!

  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-09 18:38
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
<?php
//ongetest maar het idee mag duidelijk zijn hoop ik
include ("config.php");

$query = 'SELECT titel FROM collectie ORDER BY titel';
$info = mysql_query($query) or die ("Lezen gegevens mislukt.");

$lastletter='';

while ($gegeven = mysql_fetch_assoc($info))
{
        $char = $gegeven['titel']{0};
        // controleer of het een letter [A-z] is
        if (!ctype_alpha($char))
        {
                // aha, het is geen letter, dan wordt het een #
                $char = '#';
        }
        // is de vorige letter hetzelfde als de eerste letter?
        // LET OP: De eerste letter zou dus ook al een # kunnen zijn!
        if($lastletter != $lastletter = $char)
        {
                echo '<hr />'.$lastletter;
        }
        echo $gegeven['titel'].'<br />';
}
?>

[ Voor 77% gewijzigd door Skaah op 02-06-2004 19:38 . Reden: Kan nog wel een instructie minder... lekkere code maak ik weer :r ]


Acties:
  • 0 Henk 'm!

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 22:34
code:
1
2
3
4
5
6
if (is_numeric(substr($gegeven['titel'], 0, 1))
{
 $beginnen_niet_met_letter[] = $gegeven['titel'];
} else {
 #wat je normaal doet
}


Dan krijg je een de normale output en een array met alle titels die beginnen met een letter.

Regeren is vooruitschuiven


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Skaah schreef op 02 juni 2004 @ 19:25:
[...]

Je hoeft niet te substr-en, je kan een String benaderen per teken
Oke, die link doet het om de een of andere manier niet en als ik op de nederlandse gedeelte van php.net strings kijk kan ik niet vinden wat je bedoeld.....

Acties:
  • 0 Henk 'm!

  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-09 18:38
T-MOB schreef op 02 juni 2004 @ 19:30:
code:
1
2
3
4
5
6
if (is_numeric(substr($gegeven['titel'], 0, 1))
{
 $beginnen_niet_met_letter[] = $gegeven['titel'];
} else {
 #wat je normaal doet
}


Dan krijg je een de normale output en een array met alle titels die beginnen met een letter.
is_numeric? Lekker, die pakt zeker ook ", ', /, -, _, . enz? Is bovendien traag.
Verwijderd schreef op 02 juni 2004 @ 19:32:
[...]


Oke, die link doet het om de een of andere manier niet en als ik op de nederlandse gedeelte van php.net strings kijk kan ik niet vinden wat je bedoeld.....
us2.php.net is zeker down. Check ff mijn vorige post.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Skaah schreef op 02 juni 2004 @ 19:35:
[...]


is_numeric? Lekker, die pakt zeker ook ", ', /, -, _, . enz? Is bovendien traag.


[...]


us2.php.net is zeker down. Check ff mijn vorige post.
Oke dankje......

[ Voor 147% gewijzigd door Verwijderd op 02-06-2004 21:53 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Na wat aanpassingen te hebben gedaam ten aanzien van bovenstaand heb ik nog 1 probleem. Namelijk wanneer ik onderstaand code gebruik laat hij maar 1 titel zien in plaats van de alles. Nu dacht ik zet er een do in boven datgene wat herhaald moet worden maar het mocht niet helpen.

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
do{
echo"
<TABLE cellSpacing=0 cellPadding=20 width=750 align=center border=0>
  <TBODY>
    <TR>
        <TD class=contentbody>";
    
            while ($g = mysql_fetch_assoc($i)) {
                $c = $g['title']{0}; 
                if (!ctype_alpha($c)) { 
                    $c = '#'; 
                }
                if($l != $l = $c){
                    echo"
                    <TABLE cellSpacing=1 cellPadding=3 width=\"100%\" border=0>
                        <TBODY>
                            <TR>
                                <TD class=header colSpan=4><FONT size=+1><B>$l</B></FONT></TD>
                            </TR>
                            <TR>
                                <TD class=content width=10>
                                <DIV class=region>
                                <LI></LI></DIV></TD>
                                <TD class=content>
                                    <a href=\"info.php?id=$g[dvd_nr]\">$g[title]</a>
                                </TD>
                                <TD class=content noWrap width=\"1%\"><SPAN class=date></SPAN>
                                </TD>
                            </TR>
                        </TBODY>
                    </TABLE>
                </TD>
            </TR>
        </TABLE>";
}}
}while ($g = mysql_fetch_assoc($i));


wat doe ik nog verkeerd

Acties:
  • 0 Henk 'm!

  • alienfruit
  • Registratie: Maart 2003
  • Laatst online: 20:38

alienfruit

the alien you never expected

Missschien heb je hier wat aan? Volgens mij werkt dit wel, ik kan nu niet kijken of het werkt omdat de press service bij BMG offline is <g>

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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
//
//
$artists_index = "";
$artistsnames = "";

//
//
// Obtain index list...
//
$artists_names = GetDirectoryList ( $gallery_dir, true );
//
//
//print_r($artists_names);

//
// builds the index A..Z etc. above
// 
$count = 0;
while ( $count <= count($artists_names) ) {
  $artist_letter = substr ( $artists_names[ $count ], 0, 1);    // obtains the first char of the string
  $artist_letter = strtoupper($artist_letter);
  //print $artist_letter;
  if ( $artist_letter != $index_letter ) {
     $artists_index  .= "<a href=\"#{$artist_letter}\">{$artist_letter}</a>&nbsp;\n";
    $index_letter =  $artist_letter;
  } 
  $count++;
}

$artistsnames   = "";
$count          = 0;
$inside_letter  = false;
$current_letter = "";

$artistsnames .= "<code>";
$artistsnames .= "</code>";
while ( $count < count($artists_names) ) {
  //
  // Loops through the array with Artist Names / directories...
  $artist_letter = substr( $artists_names[ $count ], 0, 1 ); // obtain artist begin letter
  $artist_letter = strtoupper($artist_letter); 
 
  //$current_letter = "";
  if ( $current_letter != $artist_letter ) {
    // not equals same begin letter; new one ;) ?
     $artisturlcode = urlencode( $artists_names[$count] );
     $artistsnames .= "<tr>\n <td colspan=\"2\" bgcolor=\"#CCCCCC\"><font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"1\"><a name=\"{$artist_letter}\"><b>{$artist_letter}</b></a></td><td><font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"1\"><a href=\"#top\">terug naar boven</a></font></td>\n </tr>\n";
     $artistsnames .= "<tr>\n <td colspan=\"3\" ><font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"1\"><a href=\"{$artist_url}{$artisturlcode}\">{$artists_names[$count]}</a></font></td></tr>\n";    
     $current_letter = strtoupper($artist_letter);
  } else { 
        // equals same begin letter
      $artisturlcode = urlencode( $artists_names[$count] );
        $artistsnames .= "<tr>\n <td colspan=\"3\" ><font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"1\"><a href=\"{$artist_url}{$artisturlcode}\">{$artists_names[$count]}</a></font></td></tr>\n";    
     }
  //
  // (1) Iterate through the list, and get the starting letter per word...
  // (2) Checking if the starting letter is the same as index letter
  //        (A) Yes, add the letter to the index of this letter
  //            (B) No, then we found a new letter, make a new header...
  // (3) Repeat step (1)
   
  // enhance counter...
  $count++;   
}

$subscribe_from = array( "<#artistindex#>", "<#artistnames#>" );
$subscribe_to   = array( $artists_index, $artistsnames );
//
specialInclude ( "artists.template", $subscribe_from, $subscribe_to );

[ Voor 130% gewijzigd door alienfruit op 03-06-2004 05:53 ]


Acties:
  • 0 Henk 'm!

Verwijderd

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
<?
// init 
$data = array('_mooi_hoor', '0daysfromhell', '1stgame', '2fast2furious', '8miles', 'aap',
'beer', 'brood', 'dik', 'fluit', 'fanatiek', 'graag', 'huis'); 

// echo 
for($i=0;$i<count($data);$i++) 
{ 

    // eerste letter in var stoppen;
    // kan ook met $data[$i]{0) zoals Skaah@GoT netjes meld
    $firstLtr = substr($data[$i],0,1);

    // verschil detecteren tussen [a-z] en andere tekens (0,1,2,#,etc.)
    if(!ereg("[a-zA-Z]", $firstLtr)) {
        $firstLtr = "#";    
    }

    // nieuwe groep (=letter) weergeven?
    if($i == 0 OR $firstLtr != $oldLtr) {
        echo '<b>' . $firstLtr . '</b><br>'; 
    }

    // data weergeven
    echo $data[$i] . '<br>'; 

    // huidige groep opslaan voor volgende loop
    $oldLtr = $firstLtr;

}
?> 


:Y)

[ Voor 37% gewijzigd door Verwijderd op 03-06-2004 10:17 ]

Pagina: 1