Opmaak lange cijferlijst

Door Robert Deiman, 20 jaar geleden, 4.639x bekeken

Vanwege een vraag, en omdat ik het wel een leuk probleem vond heb ik dit scriptje gemaakt. De functie kan zowel omgaan met een string als met een array, dus de manier van input is eenvoudig.

Je hebt bijvoorbeeld een string als:
1,2,3,5,6,7,12,13,14,16

De output van de functie is dan:
1-3, 5-7, 12-14, 16

Zeker wanneer je een lange lijst met nummers hebt is dit veel overzichtelijker.

Edit:

Omdat je eigenlijk geen ranges selecteerd, maar alleen getallen op een dusdanige manier weergeeft dat het prima te lezen is, heb ik de naam veranderd. Het is niet een omgekeerde range functie, maar juist de opmaak van de getallenlijst.


Edit:

Ik heb nog een kleine aanpassing gedaan, zodat je niet eens de getallen in de juiste volgorde in hoeft te geven. Hij sorteerd ze binnen de functie.


Edit:

Donderdag 24-01-2008 17:36
Wegens het goede idee van PHPnewbie om ook de mogelijkheid te geven de missende getallen te retourneren een aanpassing gemaakt. Verder de code nog iets verbeterd.

Wel op m'n eigen manier gehouden.

Gesponsorde koppelingen

PHP script bestanden

  1. opmaak-lange-cijferlijst

 

Er zijn 22 reacties op 'Opmaak lange cijferlijst'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Robin de Vries
Robin de Vries
20 jaar geleden
 
0 +1 -0 -1
en hoe kun je checken of je nummer ertussen stond?
Johan M
Johan M
20 jaar geleden
 
0 +1 -0 -1
Super goed, bedankt Robert. Ik ga hem zeker gebruiken, zo wordt m'n pagina een stuk overzichtelijker!

@Robin: dat moet lijkt mij wel te controleren zijn met de functie in_array().
Michael
michael
20 jaar geleden
 
0 +1 -0 -1
Ik vind em opzich wel grappig. Alleen wanneer heb je dit precies nodig? Ik kan me zo snel niet zo goed bedenken wanneer je het nodig hebt
Vincent
Vincent
20 jaar geleden
 
0 +1 -0 -1
Mooi gemaakt Robert!
Johan M
Johan M
20 jaar geleden
 
0 +1 -0 -1
@ Michael: ik heb dit toevallig op het moment nodig, vandaar mijn vraag in het forum en vervolgens deze post hierboven.
Het geval wil dat ik een pagina heb die lijsten met getallen uit de database haalt, en deze weergegeven moeten worden zodat het overzichtelijk en goed leesbaar is. Als je dan hele lijsten hebt zoals: 1, 2, 3, 4, 6, 7, 8, 20, 21, 22, enz., dan is het wel zo prettig dat het wordt weergegeven als 1 - 4, 6 - 7, 20 - 22. Dat leest wel zo prettig vind ik persoonlijk.
Robert Deiman
Robert Deiman
20 jaar geleden
 
0 +1 -0 -1
@Robin de Vries

De functie is niet bedoeld om je te laten zien of je nummer er tussen stond of niet, maar om een string met getallen die je wil laten zien, op een overzichtelijkere manier weer te geven.
1,2,3,4,5,6,7,8,9,10,12,13,14,15,16,17,19 wordt dan: 1-10, 12-17, 19
Wat kan jij sneller lezen?

@Johan
Graag gedaan, ik vond het wel een leuk vraagstukje :)

@michael
Dat vroeg ik mezelf ook af, maar wanneer je een lange lijst met unieke nummers weer wilt geven, maar je weet niet of alle nummers bestaan is het met deze weergave veel gemakkelijker te zien.
Robin de Vries
Robin de Vries
20 jaar geleden
 
0 +1 -0 -1
@robert

ok maar ik zou niet weten hoe ik in die output kan kijken of het nummer 15 in stond... misschien moet je een functie maken die de rij doorzoekt naar het opgegeven nummer.
Robert Deiman
Robert Deiman
20 jaar geleden
 
0 +1 -0 -1
@Robin de Vries

PHP heeft al zo'n functie op zich, namelijk in_array();

Binnen mijn functie heb je een stukje (zal het aangeven door comments) dat controleerd of het een array is, en er anders een array van maakt.
De rest van de functie heb je op zich niet nodig, maar als je nadat er een array van is gemaakt onderstaande doet moet het al werken. Het is in ieder geval niet waar deze functie voor is:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
    if(in_array($input, $array)){
        return true;
        }

    else{
        return false
        }
?>
Jasper
jasper
20 jaar geleden
 
0 +1 -0 -1
Kan van pas komen deze functie. Maar er kan als uitbreiding nog een functie geschreven worden om te testen of een getal er in zit of niet (zoals hierboven al voorgesteld) Maar ook om een bepaald getal toe te voegen, en of te verwijderen.

Wat ook nog eventueel zou kunnen is vertrekken van een array met alle getallen in, of het teruggeven van een array met alle getallen.

Het is ook maar een tip!
Robert Deiman
Robert Deiman
20 jaar geleden
 
0 +1 -0 -1
@Jasper

Die uitbreiding heeft werkelijkwaar niets met deze functie te maken. Waarom iedereen daarover iets heeft snap ik niet. Het gaat om de OPMAAK van de text, zo kan je veel overzichtelijker een lange reeks getallen weergeven.

En waarom een array met alle getallen erin teruggeven? Je input is een string, met de explode functie van PHP kan je al een array maken met alle getallen (dat is dus ook wat in de functie gebeurt).
En je kan al vertrekken vanuit een array met alle getallen erin, als je de comments boven de functie ook had gelezen zou je dat hebben gezien.
PHP Newbie
PHP Newbie
20 jaar geleden
 
0 +1 -0 -1
Kan korter en overzichtelijker:

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
<?php
    error_reporting(E_ALL);
    
    function
getallen($getallenreeks, $scheidingsteken = ' ', $shownietinreeks = false)
    {

        $return = null;
        
        if(!is_array($getallenreeks))
        {

            $getallenreeks = explode($scheidingsteken, $getallenreeks);
        }

        
        sort($getallenreeks);
        
        for($i = 1,$arrays=1; $i<=max($getallenreeks); $i++)
        {

            if(in_array($i, $getallenreeks))
            {

                $reeksen[$arrays][] = $i;
            }

            else
            {
                $nietinreeks[] = $i;
                $arrays++;
            }
        }

        
        foreach($reeksen as $reeks)
        {

            if(min($reeks) == max($reeks))
            {

                $return .= min($reeks).' ';
            }

            else
            {
                $return .= min($reeks).'-'.max($reeks).' ';
            }
        }

        
        if($shownietinreeks)
        {

            $return .= '<br />In deze reeks komen de volgende getallen niet voor: '.implode(' ', $nietinreeks);
        }


        return $return;
    }

    
    $getallenreeks_spatie     = '2 1 3 4 6 7 8 9 11 12 13 14 30 16 17 19 21 22 23 24 25 15';
    $getallenreeks_komma    = '2,1,3,4,6,7,8,9,11,12,13,14,30,16,17,19,21,22,23,24,25,15';
    $getallenreeks_array    = array(2,1,3,4,6,7,8,9,11,12,13,14,30,16,17,19,21,22,23,24,25,15);
    
    echo getallen($getallenreeks_spatie,' ', true).'<br /><br />';
    echo getallen($getallenreeks_spatie).'<br /><br />';
    echo getallen($getallenreeks_komma, ',', true).'<br /><br />';
    echo getallen($getallenreeks_array);
?>


Verder is het idee wel leuk :-)

Edit:

Even een optie toegevoegd zodat je ook de getallen kunt laten zien die niet in de array voorkomen
Robert Deiman
Robert Deiman
20 jaar geleden
 
0 +1 -0 -1
Is ook een goede manier Newbie :) (die geen newbie meer is) Ik weet dat het best korter had gekunt, maar juist omdat degeen waarvoor ik het maakte niet super veel PHP kennis heeft, heb ik het zo uitgebreid gedaan, dat is begrijpelijker.
Korter is niet altijd begrijpelijker, maar wel leuk dat je het idee goed vind..:)
PHP Newbie
PHP Newbie
20 jaar geleden
 
0 +1 -0 -1
Nou.. als ik zo even kijk lijkt me mijn code toch net wat overzichtelijker dan de jouwe (wijst naar regels 36-49 :-p)
Robert Deiman
Robert Deiman
20 jaar geleden
 
0 +1 -0 -1
@PHP Newbie

Maar ik mis bij jou ook dat die wanneer er 2 opvolgende getallen zijn 1,2,4,5,6 dat die daar dan 1,2, 4-6 van maakt.. dat is qua weergave denk ik netter dan als je 1-2 krijgt.. want als je 1-2 hebt, dat betekend gewoon dat je 1 en 2 hebt..
Dat is eigenlijk ook het grote verschil in dat stukje. Om dat af te vangen heb ik 3 ifs.
Marvin S
Marvin S
20 jaar geleden
 
0 +1 -0 -1
Wat wordt er weergegeven met deze tekenreeks als ik vragen mag?

1,2,3,4,6,8,9,10
Robert Deiman
Robert Deiman
20 jaar geleden
 
0 +1 -0 -1
1-4, 6, 8-10
Marvin S
Marvin S
20 jaar geleden
 
0 +1 -0 -1
@Robert
Prima dus :D

edit: leuk scriptje!
Robert Deiman
Robert Deiman
20 jaar geleden
 
0 +1 -0 -1
Dankje Marvin, de versie die er nu staat heeft wel iets van PHP Newbie meegenomen (namelijk de mogelijkheid tot retourneren van missende getallen, maar dan wel meteen opgemaakt zoals de getallen die er wel in zitten)

@PHP Newbie
Ik heb wel iets aangepast en verkort, en het idee om de missende getallen ook te laten zien heb ik wel meegenomen.
PHP Newbie
PHP Newbie
20 jaar geleden
 
0 +1 -0 -1
En zo vullen we elkaar lekker aan :-)
Johan M
Johan M
20 jaar geleden
 
0 +1 -0 -1
Robert_Deiman:
... maar juist omdat degeen waarvoor ik het maakte niet super veel PHP kennis heeft ...

En bedankt :p
Zonder mezelf de hemel in te prijzen wil ik even benadrukken dat ik wel degelijk het een en ander van PHP weet, ik kreeg alleen dit even niet voor elkaar.

De manier van PHP Newbie is idd ook okay, maar ik houd het bij jouw versie Robert, aangezien deze alles doet wat ik er van hoopte dat het zou doen. Ik heb je functie dan ook vandaag moeiteloos ingebouwd en het werkt perfect!

Grz. Johan.
Robert Deiman
Robert Deiman
20 jaar geleden
 
0 +1 -0 -1
Precies, en dat is ook precies de bedoeling van het kunnen geven van feedback.. Om de boel beter te maken.

@Johan
Toen ik ermee bezig was en het 1e voorbeeldje postte, kreeg ik er meteen een vraag over. Sorry als ik hieruit verkeerd opmaakte dat je niet zo veel kennis had, maar ik dacht ook dat de code op zich voor zichzelf sprak.
Overigens heb ik ook meteen meer commentaar ingevoegd om duidelijker te laten zien wat de verschillende onderdelen van de functie doen
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Johan M
Johan M
20 jaar geleden
 
0 +1 -0 -1
De code is prima en spreekt inderdaad voor zich, ik heb even het topic nagelezen en kom geen onnozele vragen tegen. Geëdit ofzo zeker... Geloof dat dat over de input van een enkel getal ging, maar dat was al opgelost voordat ik mijn bericht postte.

Belangrijkste is dat de functie nu nog mooier een beter geworden is, ik heb er toch weer van geleerd.

Om te reageren heb je een account nodig en je moet ingelogd zijn.

Inhoudsopgave

  1. opmaak-lange-cijferlijst

Labels

  • Geen tags toegevoegd.

Navigatie

 
 

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.