[PHP] getallen reeksen splitten

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • bakakaizoku
  • Registratie: Januari 2002
  • Laatst online: 17-09 10:27
Ik zit met het volgende..

Via een form submit worden er enkele getallen meegestuurd naar een php script. Dit kan uiteindelijk resulteren in iets als dit:

1
2
3
6
7
8
22
24
27

Ik wil dat dit in reeksen wordt gesplit, dus dat hij bijvoorbeeld het volgende echoet "1 t/m 3" "6 t/m 8" "22" "24" "27"

Ik ben wel zover gekomen dat hij "1 t/m 3" etc split, alleen niet de losse getallen.. M'n code om te splitten is als volgt:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
$a = $data[1]-1;
$z = 0;
for ($x = 1; $x <= count($data); $x++) {
    $z++;
    $y[$z] = $data[$x];
    if (($y[$z] - $a != 1) || ($x == count($data))) {
        if ($x == count($data)) { $a = $data[$x]; }
        echo $y[1]." t/m ".$a."<br>";
        $z = 1;
        $y[1] = $data[$x];
    }
    $a = $data[$x];
}


De code zal vast wel brak zijn in sommige ogen, en ik sta uiteraard open voor eventuele andere oplossingen, maar waar het mij in de eerste instantie om gaat is om ook de los staande getallen als zodoende los staand weer te geven..

Anyone?

PSN: bakakaizoku - WoW: Thiccblonde (GM of Phoenix Ascension) @ Twisting-Nether


Acties:
  • 0 Henk 'm!

Verwijderd

Hoe ontvang je die cijfers uit je formulier?
In losse variabelen of als 1 string?

Acties:
  • 0 Henk 'm!

  • bakakaizoku
  • Registratie: Januari 2002
  • Laatst online: 17-09 10:27
een array die om wordt gezet
PHP:
1
2
3
4
5
6
$tmp = $_POST['data'];
$x = 0;
foreach ($tmp as $a => $b) {
    $x++;
    $data[$x] = "$a";
}

PSN: bakakaizoku - WoW: Thiccblonde (GM of Phoenix Ascension) @ Twisting-Nether


Acties:
  • 0 Henk 'm!

  • cavey
  • Registratie: Augustus 2000
  • Laatst online: 29-05 01:29
je doet ook maar 1 echo?

echo a t/m b
maar de losse getallen echo je niet? zodra interval groter dan 1 wordt, meteen echo'n en op naar de volgende. Verder lijkt de code me wel ok...

[ Voor 3% gewijzigd door cavey op 09-04-2004 11:36 ]


Acties:
  • 0 Henk 'm!

  • Skaah
  • Registratie: Juni 2001
  • Laatst online: 16-09 18:38
Vraag niet goed gelezen
Zet je getallen in een array, loop de array af met een for lus. Kijk of het getal+1 hetvolgendegetal is.
Code: (niet getest!)

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$getallen = array(1,2,3,6,7,8,22,24,27);
$groepen = array();

for($i = 0; $i < count($getallen); $i++)
{   
    if (($i = 0) || ($getallen[$i+1] > ($getallen[$i] + 1)))
    {
        $groepen[] = (string) $getallen[$i]; // nieuwe groep
    }
    if (($i = count($getallen)) || ($getallen[$i] < $getallen[$i+1]-1))
    {
        $groepen[count($groepen)] .= ' t/m '.$getallen[$i];
    }
}

[ Voor 10% gewijzigd door Skaah op 09-04-2004 11:43 ]


Acties:
  • 0 Henk 'm!

  • bakakaizoku
  • Registratie: Januari 2002
  • Laatst online: 17-09 10:27
komakeef schreef op 09 april 2004 @ 11:36:
je doet ook maar 1 echo?

echo a t/m b
maar de losse getallen echo je niet? zodra interval groter dan 1 wordt, meteen echo'n en op naar de volgende. Verder lijkt de code me wel ok...
ik snap niet echt wat je bedoelt, aangezien als de interval groter is dan 1, hij met een nieuwe reeks moet beginnen, dus zou ik het echoen, dan wordt bij elke nieuwe reeks het getal 2x geshowed

PSN: bakakaizoku - WoW: Thiccblonde (GM of Phoenix Ascension) @ Twisting-Nether


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
32
33
  // init
  $data = array(1, 2, 3, 6, 7, 8, 22, 24, 27);

  // calculate
  for($i=0, $flag=0;$i<count($data);$i++)
  {

      if(!empty($data[$i+1]) AND $data[$i+1] == $data[$i] + 1)
      {
        $tmpData[] = $data[$i];
        $flag = 1;
      }
      else
      {
        $flag = 0;
      }

      if($flag == 0)
      {
         if(isSet($tmpData))
         {
             echo $tmpData[0] . ' t/m ';
             $tmpData = array_reverse($tmpData);
             echo $tmpData[0] + 1;
             echo '<br>';
         }
         else
           echo $data[$i] . '<br>';

         unSet($tmpData);
      }

  }

Acties:
  • 0 Henk 'm!

  • Tjark
  • Registratie: Juni 2000
  • Laatst online: 18-09 23:26

Tjark

DON'T PANIC

vervang
PHP:
1
2
3
4
echo $tmpData[0] . ' t/m '; 
             $tmpData = array_reverse($tmpData); 
             echo $tmpData[0] + 1; 
             echo '<br>';

door
PHP:
1
echo $tmpData[0] . ' t/m ' . (array_pop($tmpData)+1).'<br>';


maareh, moet ie bij bv
$data = array(1, 2, 3, 6, 7, 8, 22, 24, 25, 27);

etc, 24 t/m 25, etc weegeven of
etc, 24, 25, etc
?

[ Voor 42% gewijzigd door Tjark op 09-04-2004 12:24 ]

*insert signature here


Acties:
  • 0 Henk 'm!

Verwijderd

TS zegt dat hij reeksen wil weergeven als x t/m y, en 2 opeenvolgende getallen zijn volgens mij een reeks?

[ Voor 8% gewijzigd door Verwijderd op 09-04-2004 12:36 ]


Acties:
  • 0 Henk 'm!

  • Tjark
  • Registratie: Juni 2000
  • Laatst online: 18-09 23:26

Tjark

DON'T PANIC

enieweej, als ie toch ,24,25, wilt dan moet ie
PHP:
1
2
           count($tmpData)==1 ? $tussen = ', ' : $tussen = ' t/m ';
           echo $tmpData[0] . $tussen . (array_pop($tmpData)+1).'<br>';

doen.

*insert signature here


Acties:
  • 0 Henk 'm!

  • bakakaizoku
  • Registratie: Januari 2002
  • Laatst online: 17-09 10:27
Verwijderd schreef op 09 april 2004 @ 12:27:
TS zegt dat hij reeksen wil weergeven als x t/m y, en 2 opeenvolgende getallen zijn volgens mij een reeks?
mja, ik had het waarschijnlijk vanwege slaapgebrek @ stage een beetje krom geformuleerd.. maar ik ga eens met de mogelijke oplossingen aan de slag :) :>

PSN: bakakaizoku - WoW: Thiccblonde (GM of Phoenix Ascension) @ Twisting-Nether


Acties:
  • 0 Henk 'm!

  • [ash]
  • Registratie: Februari 2002
  • Laatst online: 05-04 18:06

[ash]

Cookies :9

Ik vond het wel even een leuke bezigheid @ work op goedevrijdag ;)

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
<?php
$data=array(1,2,3,6,7,8,22,24,27);
$cnt=count($data);
$tm=0;

for ($i=0;$i<$cnt;$i++){

 if ($i<$cnt) {
   if (isset($last) && $data[$i]==$data[$last]+1) { 
     if ($tm==0){
       echo "&nbsp;t/m&nbsp;";
       $tm=1;}
     else {
       echo "$data[$i]";
       $tm=0;
     }
   }
   else {
     echo "<br />".$data[$i];
     $tm=0;
     }
    $last=$i;
  }
  else{
    if ($tm==0) { echo "<br />"; }
    echo $data[$i];
  }
}
?>

[ Voor 10% gewijzigd door [ash] op 09-04-2004 14:16 ]


Acties:
  • 0 Henk 'm!

Verwijderd

[ash] schreef op 09 april 2004 @ 14:11:
Ik vond het wel even een leuke bezigheid @ work op goedevrijdag ;)

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
<?php
$data=array(1,2,3,6,7,8,22,24,27);
$cnt=count($data);
$tm=0;

for ($i=0;$i<$cnt;$i++){

 if ($i<$cnt) {
   if (isset($last) && $data[$i]==$data[$last]+1) { 
     if ($tm==0){
       echo "&nbsp;t/m&nbsp;";
       $tm=1;}
     else {
       echo "$data[$i]";
       $tm=0;
     }
   }
   else {
     echo "<br />".$data[$i];
     $tm=0;
     }
    $last=$i;
  }
  else{
    if ($tm==0) { echo "<br />"; }
    echo $data[$i];
  }
}
?>
/me vraagt zicht toch enigzins verbaasd - en inmiddels dronken - af wat er mis is mij zijn oplossing...? :)

Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
mattttt schreef op 09 april 2004 @ 11:31:
een array die om wordt gezet
PHP:
1
2
3
4
5
6
$tmp = $_POST['data'];
$x = 0;
foreach ($tmp as $a => $b) {
    $x++;
    $data[$x] = "$a";
}
Ik snap niet zo goed waarom je $tmp gebruikt. Daarme kopieer je dat sub-array van $_POST al een keer, en vervolgens kopieer je hem nog eens met je foreach.

m.a.w. je kan ook gewoon

code:
1
foreach ($_POST['data'] as $a => $b)

gebruiken. Niet echt ontopic, maar misschien wel handig om je code-leesbaarheid te verhogen.

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • [ash]
  • Registratie: Februari 2002
  • Laatst online: 05-04 18:06

[ash]

Cookies :9

Verwijderd schreef op 09 april 2004 @ 20:44:
/me vraagt zicht toch enigzins verbaasd - en inmiddels dronken - af wat er mis is mij zijn oplossing...? :)
Niets denk ik (althans... ik heb hem niet getest ;) ). Maar ik was er gewoon ff mee bezig en vondt het zonde om niet te posten.

Persoonlijk vindt ik het introduceren van een nieuwe array een beetje overbodig, maar dat is persoonlijke voorkeur.

Acties:
  • 0 Henk 'm!

  • bakakaizoku
  • Registratie: Januari 2002
  • Laatst online: 17-09 10:27
Grijze Vos schreef op 09 april 2004 @ 23:24:
[...]


Ik snap niet zo goed waarom je $tmp gebruikt. Daarme kopieer je dat sub-array van $_POST al een keer, en vervolgens kopieer je hem nog eens met je foreach.

m.a.w. je kan ook gewoon

code:
1
foreach ($_POST['data'] as $a => $b)

gebruiken. Niet echt ontopic, maar misschien wel handig om je code-leesbaarheid te verhogen.
omdat $data[] niet een oplopende reeks hoeft te zijn, stel $data[] is een array van (1,55,2023,42344) en je doet een count($data), dan krijg je in principe een reeks van 1 tm 4..

aangezien $data[] bij mij de getallen als $data[1] moet parsen, en niet $data['1'] gaat dat dus problemen opleveren, daarom moet ik het eerst omzetten..

PSN: bakakaizoku - WoW: Thiccblonde (GM of Phoenix Ascension) @ Twisting-Nether


Acties:
  • 0 Henk 'm!

  • bakakaizoku
  • Registratie: Januari 2002
  • Laatst online: 17-09 10:27
overigens werkt de code van ivy als een zonnetje, thx _/-\o_

PSN: bakakaizoku - WoW: Thiccblonde (GM of Phoenix Ascension) @ Twisting-Nether


Acties:
  • 0 Henk 'm!

Verwijderd

Succes ermee 8)
Pagina: 1