2009-05-30 13 views
0

J'ai une chaîne alphanumérique comme ci-dessous,Alternance Majuscules en Array utilisant PHP

$string_1 = "a4nas60dj71wiena15sdl1131kg12b" 

et voudrait changer quelque chose comme ci-dessous,

$string_2 = "a4NaS60dJ71wIeNa15Sdl1131Kg12B" 

Comment pourrais-je faire de manière ? J'ai essayé le code ci-dessous, mais cela ne fonctionne pas.

$lenght = strlen($string_1); 

for ($i = 0; $i <= $length - 1; $i += 1) { 

    if ($i % 2) { 

     $string_2[$i]=strtoupper($string_1[$i]); 

    } 

    else { 

     $string_2[$i]=$string_1[$i]; 

    } 

} 

echo $string_2; 

Le code ci-dessus imprime "Array" de sorte que quelque chose ne fonctionne définitivement pas.

+0

vous avez mal orthographié la première longueur de $ – Galen

Répondre

1

Par ailleurs, vous avez une légère erreur dans votre chaîne capitalisée:

$string_1: a4nas60dj71wiena15sdl1131kg12b 
$string_2: a4NaS60dJ71wIeNa15Sdl1131Kg12B 
          ^should be capital so out of sync for rest of string 

Je vais vous donner deux façons de le faire:

<?php 
header('Content-Type: text/plain'); 

$string_1 = "a4nas60dj71wiena15sdl1131kg12b"; 
$string_2 = "a4NaS60dJ71wIeNa15Sdl1131Kg12B"; 

$letter_count = 0; 
$result = ''; 
for ($i=0; $i<strlen($string_1); $i++) { 
    if (!preg_match('![a-zA-Z]!', $string_1[$i])) { 
     $result .= $string_1[$i]; 
    } else if ($letter_count++ & 1) { 
     $result .= strtoupper($string_1[$i]); 
    } else { 
     $result .= $string_1[$i]; 
    } 
} 

$result2 = preg_replace_callback('!([a-zA-Z]\d*)([a-zA-Z])!', 'convert_to_upper', $string_1); 

function convert_to_upper($matches) { 
    return strtolower($matches[1]) . strtoupper($matches[2]); 
} 

echo "$string_1\n"; 
echo "$string_2\n"; 
echo "$result\n"; 
echo "$result2\n"; 
?> 

Note: Les marques ci-dessus plusieurs hypothèses:

  1. Des caractères autres que des chiffres et des lettres peuvent figurer dans la chaîne;
  2. Vous souhaitez alterner le cas quel que soit l'original (par exemple, "ASDF" devient "aSdF");
  3. Vous mettez en majuscule toutes les deuxièmes lettres, pas toutes les deuxièmes lettres minuscules.

Ce qui précède peut être modifié si ces hypothèses sont incorrectes.

+0

Impressionnant, je vous remercie beaucoup pour aller au-delà de la question et de me donner deux façons de le faire. Tout d'abord, les hypothèses que vous avez faites étaient bien pour ce scénario. Deuxièmement, y a-t-il un de ces exemples qui soit meilleur que l'autre? – JoshFinnie

0

Les chaînes ne sont pas des tableaux, et vous déclarer le STRING_2 $ comme un tableau ...

Pourtant, votre code ne fonctionnera pas tout à fait comme prévu, puisque, vous ALTERNATIF cas de tous les autres lettre, tout en ignorant les numéros

les opérations suivantes:

function altCaps($str) { 
    $lower = true; 
    $str2 = ""; 
    for ($i=0;$len=strlen($str);$i<$len;++$i) { 
     $char = substr($str,$i,1); 
     if (is_numeric($char)) { 
      $str2 .= $char; 
     } else { 
      if ($lower) { 
       $str2 .= strtolower($char); 
      } else { 
       $str2 .= strtolower($char); 
      } 
      $lower = !$lower; 
     } 
    } 
    return $str2; 
} 
+1

Cela va compter les traits d'union, les points et d'autres caractères non numériques comme des lettres. –

+0

true, son format de chaîne n'inclut aucun de ces caractères –

+0

@Skidmore, La question d'origine indique "chaîne alphanumérique", donc ces caractères n'ont pas besoin d'être manipulés du tout. – strager

0

Vous devriez être bon d'aller avec cette fonction. Appelez simplement alternate ('string here'); et cela fonctionnera parfaitement.

Cela fonctionne avec des tirets, des espaces, des points, etc. inclus dans la chaîne.

function alternate($string1) 
{ 
    $do_caps = false; 
    $string2 = ''; 
    for ($i = 0; $i < strlen($string1); $i++) 
    { 
     $char = substr($string1, $i, 1); 
     if (stripos('abcdefghijklmnopqrstuvwxyz', $char) !== false) 
     { 
      if ($do_caps) 
      { 
       $char = strtoupper($char); 
       $do_caps = false; 
      } 
      else 
      { 
       $do_caps = true; 
      } 
     } 
     $string2 .= $char; 
    } 
    return $string2; 
}