[PHP] $str splitten in even en oneven chars ...

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Dr.Bob
  • Registratie: November 1999
  • Laatst online: 07-09 20:41

Dr.Bob

Dr.Bob says: HEAL!

Topicstarter
Weet iemand of het mogelijk is, en zo ja welke functie daar het beste geschikt voor is om een string te splitten in de even en oneven chars, zodat:
PHP:
1
2
3
4
5
6
$str = "abcdefghijklmnopqrstuvwxyz";

// hier dan de spit-code, met als resultaat:

$str_even = "bdfhjlnprtvxz";
$str_oneven = "acegikmoqsuwy";


En om het helemaal af te maken wil ik vervolgens $str_even en $str_oneven ook weer combineren tot $str.
... Of haal ik me nu hele gekke dingen op de hals?
(Yes, I know, het is niet erg zinnig, maar ik wil gewoon weten of dit kan, om een soort 'kinder'-geheimschrift te maken waarbij 2 personen een deel van de text krijgen en die moeten samenvoegen ...)

NERDCORE FOR LIFE


Acties:
  • 0 Henk 'm!

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
dat is wel mogelijk
je kunt een string ook als een soort array aanspreken
echo $str[0] zal a geven en echo $str[1] b

volgens mij is dat voldoende informatie om dan zelf een loopje bij te verzinnen :)

Acties:
  • 0 Henk 'm!

  • Tux
  • Registratie: Augustus 2001
  • Laatst online: 16-09 19:01

Tux

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function split_alpha ($str)
{
    $str['even'] = "";
    $str['oneven'] = "";

    for ($i = 0; $i < strlen ($str); $i++)
    {
        if ($i % 2 == 0)
        {
            $out['even'] .= $str[$i];
        }
        else
        {
             $out['oneven'] .= $str[$i];
        }
    }
    return $out;
}


hiermee zou je het uit elkaar kunnen halen. Het enige probleem met deze functie is dat het eerste teken bij de even getallen terecht komt.

Andere mogelijkheid:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function split_alpha ($str)
{
    $out['even'] = "";
    $out['oneven'] = "";
    $j = 0;
    for ($i = 0; $i < strlen ($str); $i++)
    {
        if ($j == 0)
        {
            $out['oneven'] .= $str[$i];
            $j = 1;
        }
        else
        {
            $out['even'] .= $str[$i];
            $j = 0;
        }
    }
    return $out;
}

[ Voor 35% gewijzigd door Tux op 26-08-2003 14:36 ]

The NS has launched a new space transportation service, using German trains which were upgraded into spaceships.


Acties:
  • 0 Henk 'm!

  • Sybr_E-N
  • Registratie: December 2001
  • Laatst online: 17-09 22:12
Je zou het met de ord() functie kunnen doen. En dan krijg je iets: (is niet getest, weet zo niet of de 'a' nou 60 of 65 is)

PHP:
1
2
3
4
5
6
  for ($i = 0; $i < 26; $i++) {
    if (ord($str[$i]) % 2 == 0)
      $str_even .= $str[$i];
    else
      $str_oneven .= $str[$i];
  }

Acties:
  • 0 Henk 'm!

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
Het enige probleem met deze functie is dat het eerste teken bij de even getallen terecht komt.
maak je toch gewoon 2 for-loopjes. een die op 0 begint en de ander die op 1 begint. problem solved

Acties:
  • 0 Henk 'm!

  • Dr.Bob
  • Registratie: November 1999
  • Laatst online: 07-09 20:41

Dr.Bob

Dr.Bob says: HEAL!

Topicstarter
Tux en Sybr_E-N: ja mooi, deze methodes werken idd allebei helemaal goed. Ga me er nu even in verdiepen dat ik ook weet hoe het komt dat het werkt :)
En zal het nou ook op een soortgelijke manier weer mogelijk zijn de 2 substrings te combineren met de tekens weer op de juiste plaats, dus weer abcdef...etc?

NERDCORE FOR LIFE


Acties:
  • 0 Henk 'm!

  • Sybr_E-N
  • Registratie: December 2001
  • Laatst online: 17-09 22:12
Dr.Bob schreef op 26 augustus 2003 @ 14:45:
Tux en Sybr_E-N: ja mooi, deze methodes werken idd allebei helemaal goed. Ga me er nu even in verdiepen dat ik ook weet hoe het komt dat het werkt :)
En zal het nou ook op een soortgelijke manier weer mogelijk zijn de 2 substrings te combineren met de tekens weer op de juiste plaats, dus weer abcdef...etc?
Ja hoor, kan gewoon met een loopje. Zoiets zal het wel doen.

PHP:
1
2
3
4
  $str = '';
  for ($i = 0; $i < 25;$i++) {
    $str .= $str_even[$i] . $str_oneven[$i];
  }

Acties:
  • 0 Henk 'm!

  • marty
  • Registratie: Augustus 2002
  • Laatst online: 27-03-2023
Dr.Bob schreef op 26 August 2003 @ 14:45:En zal het nou ook op een soortgelijke manier weer mogelijk zijn de 2 substrings te combineren met de tekens weer op de juiste plaats, dus weer abcdef...etc?
waarom zou je ze willen combineren en neem je niet gewoon de oorspronkelijke string?

Acties:
  • 0 Henk 'm!

  • Dr.Bob
  • Registratie: November 1999
  • Laatst online: 07-09 20:41

Dr.Bob

Dr.Bob says: HEAL!

Topicstarter
Thanx Sybr_E-N, that does the trick!
marty schreef op 26 augustus 2003 @ 14:52:
[...]


waarom zou je ze willen combineren en neem je niet gewoon de oorspronkelijke string?
Omdat ik 2 personen de beide substringen wil geven en die moeten ze zelf dan combineren!

NERDCORE FOR LIFE


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 16:36
Dr.Bob schreef op 26 August 2003 @ 14:45:
Tux en Sybr_E-N: ja mooi, deze methodes werken idd allebei helemaal goed.
Dat lijkt me onmogelijk, aangezien Tux en Sybr_E-N allebei een compleet ander probleem oplossen. Weet je zelf eigenlijk wel wat je wilt? Tux plaatst de letters in een array op basis van de plaats in de originele string; Sybr_E-N plaatst de letters op basis van hun plaats in de codetabel.

Hoewel beide implementaties goed zouden kunnen zijn, horen ze bij een ander probleem. Slechts een van beide algoritmen kan doen wat jij wil; maar wat jij precies wil, is blijkbaar nog onduidelijk. Wat zijn "even" en "oneven" karakters?

[ Voor 10% gewijzigd door Soultaker op 26-08-2003 15:34 ]


Acties:
  • 0 Henk 'm!

  • Dr.Bob
  • Registratie: November 1999
  • Laatst online: 07-09 20:41

Dr.Bob

Dr.Bob says: HEAL!

Topicstarter
klopt, in mijn eerste test van het alfabeth leek het allebei identiek te werken, maar wat ik daadwerkelijk wilde was wat met de wijze van Tux lukte, namelijk een gewone string.
Laten we zeggen "De kat krabt de krullen van de trap om HALF 1 's middags vanaf IP-adres 192.168.0.1" is $str. En met het even/oneven bedoel ik om en om gaan, oftewel oneven = "D a rb ekulnvnd rpo AF1' idg aa Pars121801" en even = "ektkatd rle a eta mHL smdasvnfI-de 9.6.."

En met het combine-stukje van Sybr_E-N (met aanpassing van de count-max, die is natuurlijk niet altijd 25) is het weer tot de oorspronkelijke zin in elkaar te zetten! Nou, en dat bedoelde ik :)

NERDCORE FOR LIFE


Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Even tussendoor: in de manual wordt aangeraden characters in een string dmv. { .. } operators aan te spreken i.p.v. [ .. ] operators.

PHP:
1
2
3
4
5
$str = 'abc';

for ( $i = 0; $i < strlen ( $str ); $i ++ ) {
   echo $i, ': ', $str { $i }, "\n";
}


zie:
[...]
Note: For backwards compatibility, you can still use array-braces for the same purpose. However, this syntax is deprecated as of PHP 4.
[...]
Kans dat het in latere php versies verdwijnt dus :)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • TheDuke
  • Registratie: Juni 1999
  • Niet online
wat ongelooflijk vatsig om strings met die curly braces aan te moeten spreken :r
geef mij maar de array-braces

[ Voor 3% gewijzigd door TheDuke op 26-08-2003 17:31 ]


Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

Tja, je hebt de syntax nou eenmaal niet voor 't kiezen ;)

imho is het wel logisch dat ze er andere operators voor geïntroduceerd hebben. Een string is tenslotte geen array in PHP. (ook al lijkt het daar op)

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz

Pagina: 1