[PHP] Getallen optellen in een string

Pagina: 1
Acties:
  • 705 views sinds 30-01-2008

  • Freedom
  • Registratie: Januari 2004
  • Laatst online: 09-12 23:06
Ik wil getallen die in 1 variabele staan bij elkaar optellen, maar hoe moet dit? Ik heb al even gezocht, maar ik kon niets relevants vinden.

Wat ik bedoel is dit:

Stel, je hebt een variabele $getal, met de waarde 136, hoe kan je deze dan optellen totdat er een waarde van slechts 1 cijfer groot uit komt, in dit geval dus 4 (1 + 3 = 4, 3 + 6 = 9, 9+4 = 13. 1 + 3 = 4)

[ Voor 26% gewijzigd door Freedom op 26-01-2006 20:23 ]


Verwijderd

Je wilt zien of een getal door 3 deelbaar is? ;)
En je moet niet zoeken, je moet het gewoon programmeren. En dus eerst bedenken.
Het enige wat je hoeft te kunnen, is een string opdelen in losse tekens.

  • XWB
  • Registratie: Januari 2002
  • Niet online

XWB

Devver
String opdelen en dan maar gaan optellen. Hier kom je al wat mee verder denk ik:

PHP:
1
2
3
4
5
6
7
8
9
10
<?php

$var = '136';

for ($i = 0; $i < strlen($var); $i++) 
{
   echo $var[$i] . ' ';
}

?>

[ Voor 25% gewijzigd door XWB op 26-01-2006 18:21 ]

March of the Eagles


  • pietje63
  • Registratie: Juli 2001
  • Nu online

pietje63

RTFM

nou, precies doen wat je net zelf zeft.. Je string opslitsen in losse delen en dan optellen
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
function check($input)
{
  $arr = str_split($input);
  foreach ($arr as $getal)
    {
    $output = $output + $getal;
    }
  if ($output>=9)
    {
    check($output);
    }
return ($output);
}


Zo ongeveer dan...

[edit]str_split zit alleen in php 5

Edit: volledige werkend (ook php4) voorbeeld incl source, omdat ik in een goede bui ben:
http://www.pietje63.nl/temp.php

[ Voor 63% gewijzigd door pietje63 op 26-01-2006 18:42 ]

De grootste Nederlandstalige database met informatie over computers met zoekfunctie!!


  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

Je moet een string zien als een array van characters. In dit geval is het netjes als je die characters ook even netjes cast eerst naar integers, alvorens je er operaties mee uitvoert. Zoals pietje63 al aangeeft, kun je hier dan recursie op toepassen aangezien je door wil sommeren totdat het een single digit is. Alleen moet ipv >= 9, slechts groter dan 9 gebruiken; 9 is namelijk een legaal single digit getal, alles dat erboven zit in het domein van natuurlijke getallen niet.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
    function sumToDigit($strGetal)
    {
        $length = strlen($strGetal);
        $sum = 0;

        for ($i=0; i < $length; $i++)
        {
            $sum += (int) $strGetal[i];
        }

        if ($sum > 9)
        {
            $sum = sumToDigit($sum);
        }

        return $sum;
    }
?>
pietje63 schreef op donderdag 26 januari 2006 @ 18:21:
nou, precies doen wat je net zelf zeft.. Je string opslitsen in losse delen en dan optellen
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
function check($input)
{
  $arr = str_split($input);
  foreach ($arr as $getal)
    {
    $output = $output + $getal;
    }
  if ($output>=9)
    {
    check($output);
    }
return ($output);
}


Zo ongeveer dan...

[edit]str_split zit alleen in php 5

Edit: volledige werkend (ook php4) voorbeeld incl source, omdat ik in een goede bui ben:
http://www.pietje63.nl/temp.php
Omdat ik een goede bui ben vraag ik me af wat er gebeurd met een getal als 333 ;) De som van deze getallen is 9. In jouw geval wordt er dan nog een recursieve call uitgevoerd, terwijl dat totaal niet nodig is.

[ Voor 40% gewijzigd door prototype op 26-01-2006 18:57 ]


  • Freedom
  • Registratie: Januari 2004
  • Laatst online: 09-12 23:06
Oke, ik ben dus totaal niet duidelijk geweest... mijn fout :( .
ik heb in mijn openingspost zelfs iets neergezet wat eigenlijk niet klopte.

Ik heb nu eindelijk duidelijk op een rijtje wat ik bedoelde:

- Er is een string $getal, deze bevat bijvoorbeeld de waarde 14526, maar het aantal cijfers staat niet vast

- Nu moeten de getallen worden opgeteld, op de volgende manier:

waarde1 + waarde2 ; waarde 2+ waarde 3; ... ; waarde n-1 + waarde n (waarde is 1 los cijfer)

Dit moet dan weer een nieuwe variabele worden geplaatst.

Sorry dat ik zo onduidelijk was... had een beetje problemen met formuleren

[ Voor 3% gewijzigd door Freedom op 26-01-2006 20:02 ]


  • XWB
  • Registratie: Januari 2002
  • Niet online

XWB

Devver
PHP:
1
2
3
4
5
6
7
8
$var = '136';

for ($i = 0; $i < strlen($var); $i++) 
{
   $som += $var[$i];
} 

echo $som;


Zoiets dan? En die som wil je weer ontleden en weer gaan optellen?

[ Voor 9% gewijzigd door XWB op 26-01-2006 20:09 ]

March of the Eagles


  • Freedom
  • Registratie: Januari 2004
  • Laatst online: 09-12 23:06
ja, hoe raad je het zo :)
Hmm, dit klopt toch niet helemaal, de bedoeling is, dat hij het 1e cijfer bij het tweede optelt. etc... :

code:
1
2
3
$getal = 12656;
Bewerking;
$nieuw_getal = 381111;

[ Voor 143% gewijzigd door Freedom op 26-01-2006 20:19 ]


  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

Je bedoelde dat je gewoon de cijfers binnen een getal bij elkaar op wilde tellen. Dat heet het gewicht van een getal en als je bovenstaande voorbeelden had bekeken dan was dat gedeelte van de code dat hacku gepost heeft al lang gegeven...

[edit] eerst refreshen voordat ik post :(
Freedom1987 schreef op donderdag 26 januari 2006 @ 20:12:
ja, hoe raad je het zo :)
Hmm, dit klopt toch niet helemaal, de bedoeling is, dat hij het 1e cijfer bij het tweede optelt. etc... :

code:
1
2
3
$getal = 12656;
Bewerking;
$nieuw_getal = 381111;
Tot hoever ben je zelf al gekomen? Dit is namelijk heel eenvoudig...

[ Voor 51% gewijzigd door prototype op 26-01-2006 20:25 ]


  • XWB
  • Registratie: Januari 2002
  • Niet online

XWB

Devver
Freedom1987 schreef op donderdag 26 januari 2006 @ 20:12:
ja, hoe raad je het zo :)
Hmm, dit klopt toch niet helemaal, de bedoeling is, dat hij het 1e cijfer bij het tweede optelt. etc... :

code:
1
2
3
$getal = 12656;
Bewerking;
$nieuw_getal = 381111;
Sorry, maar je bent echt niet duidelijk :X Uit de TS met je voorbeeld 136: 1 + 3 + 6 = 10. Dat doet het stukje dat ik geschreven heb. Maar als ik je nu goed begrijp wil je eigenlijk 136 = 1 + 3 = 4 en 3 + 6 = 9, dus samen 49 ? Dat is totaal iets anders.

March of the Eagles


  • Freedom
  • Registratie: Januari 2004
  • Laatst online: 09-12 23:06
Ja, ik ben heeeeeeel onduidelijk geweest, sla me er maar om, maar ik bedoel inderdaad wat Hacku zegt.

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Als je begrijpt wat de code in [rml]Hacku in "[ PHP] Getallen optellen in een string"[/rml] doet, moet je hem ook wel kunnen aanpassen zodat hij 2 elementen bij elkaar optelt en dat achteraan de string plakt.

{signature}


  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

Voutloos schreef op donderdag 26 januari 2006 @ 20:34:
Als je begrijpt wat de code in [rml]Hacku in "[ PHP] Getallen optellen in een string"[/rml] doet, moet je hem ook wel kunnen aanpassen zodat hij 2 elementen bij elkaar optelt en dat achteraan de string plakt.
Afaik is stringconcatenatie redelijk overbodig hierbij. Wat je moet doen is de minst significante cijfers bij elkaar optellen. Dus van rechts naar links, en dan met veelvouden van 10 werken om ze op de juiste positie te krijgen:

183 bijvoorbeeld, wordt dan:
3+8 = 11. 11 is een getal boven de 9 dus een tiental, de som van 1+8 moet iig in deze context een tiental meer zijn dan de genoemde tiental, dus een honderdtal opleveren. 1+8 is dan 9, maar zoals hiervoor al afgeleid moet het een honderdtal zijn dus 900. Ofwel:

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

    function rareVageBeschrijving($strGetal)
    {
        $length = strlen($strGetal);
        $tmp = 0;
        $nieuwGetal = 0;
        $factor = 1;
        
        for ($i = $length-1; $i > 0; $i--)
        {
            $tmp = $strGetal[$i-1] + $strGetal[$i];
            $nieuwGetal += $factor * $tmp;

            if ($tmp > 9)
            {
                $factor *= 100;
            }
            else
            {
                $factor *= 10;
            }
        }
        return $nieuwGetal;
    }

?>


Niet getest overigens.

[ Voor 14% gewijzigd door prototype op 26-01-2006 20:46 . Reden: Moet de functie natuurlijk wel wat returnen -_-" ]


  • Freedom
  • Registratie: Januari 2004
  • Laatst online: 09-12 23:06
OK, dank je voutloos, nu snap ik het... had zelf ook al een ingeving, en die combinatie gaat (hopelijk) werken. Ik zal mijn uiteindelijke code nog wel posten

Volgens mij is het gelukt:
code:
1
2
3
4
5
for ($i = 0; $i < strlen($getal) -1; $i++) 
{
   $optel .= $getal[$i]+$getal[$i+1];
}  
echo "$optel";

[ Voor 34% gewijzigd door Freedom op 26-01-2006 20:44 ]


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
prototype schreef op donderdag 26 januari 2006 @ 20:38:
[...]
Afaik is stringconcatenatie redelijk overbodig hierbij. Wat je moet doen is de minst significante cijfers bij elkaar optellen. Dus van rechts naar links, en dan met veelvouden van 10 werken om ze op de juiste positie te krijgen:
Dat is dus echt 100x omslachtiger. :>

[ Voor 5% gewijzigd door Voutloos op 26-01-2006 20:41 ]

{signature}


  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

Voutloos schreef op donderdag 26 januari 2006 @ 20:40:
[...]
Dat is dus echt 100x omslachtiger, of je snapt niet wat TS wil. :>
Dat is dus echt precies wat TS wil alleen dan gewoon met gebruik van het decimaal stelsel ipv concatenatie. Duizend keer efficienter ook ;)

[ Voor 6% gewijzigd door prototype op 26-01-2006 20:42 ]


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Maar puur om concatenatie te vermijden, haal je er een 2 hulpvariabelen bij, een if statement, een vermenigvuldiging en een overflow risico (output is altijd groter dan de input).

Afhankelijk van performance redenen en leesbaarheid (ik vind het zonder factorgedoe en gewoon met een simpele .= veel leesbaarder wat er gebeurt) kan je een afweging maken, maar ik zou niet op voorhand de stringconcatenatie manier wegstrepen (idem voor jouw manier ;) ).

[ Voor 5% gewijzigd door Voutloos op 26-01-2006 20:49 ]

{signature}


  • prototype
  • Registratie: Juni 2001
  • Niet online

prototype

Cheer Bear

Voutloos schreef op donderdag 26 januari 2006 @ 20:48:
Maar puur om concatenatie te vermijden, haal je er een 2 hulpvariabelen bij, een if statement en een vermenigvuldiging en een overflow risico (output is altijd groter dan de input).

Afhankelijk van performance redenen en leesbaarheid (ik vind het zonder factorgedoe en gewoon met een simpele .= veel leesbaarder wat er gebeurd) kan je een afweging maken, maar ik zou niet op voorhand de stringconcatenatie manier wegstrepen.
Stringconcatenatie is VEEL duurder ten opzichte van wat rekenkundige operaties :) Die hulp variabelen wegen niets mee ten opzichte van stringconcatenatie aangezien strings immutable zijn, en dus voor elke concatenatie een nieuwe referentie naar een nieuwe string moet worden opgebouwd :) Overigens kunnen de 2 hulp variabelen makkelijk verminderd worden naar 1, aangezien ik $tmp for the sake of readability heb gebruikt.

Wat betreft overflow heb je een punt, aangezien integers op den duur opraken. Bij stringconcatenatie behandel je het echter niet meer als een getal, maar als een string karakters; je spreekt dan uberhaupt niet meer over een getal waar PHP wat mee kan i.e. een datatype voor heeft. Het is dan discutabel wat je wil hebben idd.

[ Voor 26% gewijzigd door prototype op 26-01-2006 21:01 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Goed, genoeg zo. Freedom1987, Programming & Webscripting is geen afhaalchinees waar je code klaargemaakt wordt terwijl je wacht. Niet alleen geef je in je topicstart veel te weinig informatie, je doet dat in zo'n beetje elke post die je maakt. Daarnaast mis ik eigen inzet. Wat heb je zelf geprobeerd om tot een oplossing te komen? Waar heb je op gezocht? Wat heb je gevonden? Wat heb je daarvan geprobeerd? Wat werkte er niet aan? Waar denk je dat dat aan kan liggen? Kortom: P&W FAQ - De "quickstart". Je beantwoordt in dit topic eigenlijk geen van deze vragen, wat redelijk laks overkomt, alsof wij het werk moeten doen terwijl jij toekijkt. Heel lief van de mensen hierboven dat ze je willen helpen, maar dit is dus eigenlijk niet de bedoeling hier.

Op slot dus. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1

Dit topic is gesloten.