2014-05-08 4 views
1

J'ai une chaîne: a74b8c0d3845e7 ... etc etcPHP preg_split chaîne mixte alpha numérique puis faire clé alpha

Le modèle de base est une lettre suivie d'un numéro.

Je veux créer un tableau qui entraînerait:

Array (
[a] => 74 
[b] => 8 
[c] => 0 
[d] => 3845 
[e] => 7 
) 

Je sais que ce sera une boucle foreach (ou un couple) mais juste ne peut pas sembler comprendre.

+0

Je pense que vous devez diviser la chaîne en caractères individuels et compiler si elle est manuellement .. – Eddie

+0

Lol semble que tout le monde se bat pour cette coche. Vous avez plusieurs algorithmes de travail ici ... maintenant vous devez choisir votre favori: D –

Répondre

0

Au lieu de preg_split, vous pouvez utiliser preg_match_all pour obtenir toutes les lettres et les chiffres correspondants.

preg_match_all('/([a-z])(\d+)/', $string, $match); 
$result = array(); 
foreach ($match[1] as $i => $letter) { 
    $result[$letter] = $match[2][$i]; 
} 
+0

Est-ce que quelqu'un m'a rabaissé parce que je n'ai pas utilisé 'preg_split'? – Barmar

+0

Testé et fonctionne. – Zyre

+0

+1 pour utiliser une seule variable pour tous. –

0

Vous pouvez utiliser str_split pour diviser votre chaîne en un tableau pouvant être itéré. Voici un exemple que je viens de jeter ensemble:

// Set the string value. 
$string = 'a74b8c0d3845e7'; 

// Create the string array using `str_split`. 
$string_array = str_split($string); 

// Init `$final_array`. 
$final_array = array(); 

// Roll throgh the `$string_array` using `foreach`. 
foreach ($string_array as $string_key => $string_value) { 
    // If the value `is_numeric` assign it as `$final_value`. 
    // Else set the `$final_key` & reset the `$final_value`. 
    if (is_numeric($string_value)) { 
    $final_value = $string_value; 
    } 
    else { 
    $final_key = $string_value; 
    $final_value = ''; 
    } 
    // Set the value in the `$final_array`. 
    $final_array[$final_key] .= $final_value; 
} 

// Dump the `$final_array` to show the concept works. 
echo '<pre>'; 
print_r($final_array); 
echo '</pre>'; 

La sortie est:

Array 
(
    [a] => 74 
    [b] => 8 
    [c] => 0 
    [d] => 3845 
    [e] => 7 
) 
+0

'str_split' le divise en blocs de longueur égale. Comment cela aide-t-il ici? – Barmar

+0

@Barmar Donnez-moi du temps pour coder une solution et vous verrez. – JakeGould

+0

Vous parcourez simplement les caractères de la chaîne. Vous n'avez pas besoin d'utiliser 'str_split' pour cela, juste une boucle' for' normale. – Barmar

0

Cela devrait faire l'affaire:

$str = 'a74b8c0d3845e7'; 

$arr = preg_split('/[a-zA-Z]+/', $str, -1, PREG_SPLIT_NO_EMPTY); 
$no_num = preg_replace('/[0-9]/', '', $str); 

$new_arr = array(); 

foreach ($arr as $i=>$a) 
    $new_arr[$no_num[$i]] = $a; 

print_r($new_arr); 

Résultat:

Array 
(
    [a] => 74 
    [b] => 8 
    [c] => 0 
    [d] => 3845 
    [e] => 7 
) 
+0

Testé et fonctionne. – Zyre

0
$str = "a74b8c0d3845e7"; 
$letters = preg_split("/[0-9]+/",$str); 
$nums = preg_split("/[a-z]+/", $str); 
array_shift($nums); 
array_pop($letters); 
print_r(array_combine($letters,$nums)); 

imprime

Array 
(
    [a] => 74 
    [b] => 8 
    [c] => 0 
    [d] => 3845 
    [e] => 7 
) 
+0

Je l'essaie et en réalité rien ne s'imprime. – Zyre

+0

http://ideone.com/OdjQCn – jh314

0

Cela devrait fonctionner pour toi. Comment ça marche, ça fait 2 tableaux. Le premier tableau est divisé par des lettres, faisant un tableau de nombres. Ensuite, le tableau suivant est divisé par des nombres, faisant un tableau de lettres. Finalement les deux tableaux sont combinés dans un nouveau tableau avec la lettre comme clé et un nombre comme valeur! Très soigné ...

$string = 'a74b8c0d3845e7'; 

    $array1 = preg_split("/[a-zA-Z]+/", $string); 
    $array2 = preg_split("/[0-9]+/", $string); 

    for($i = 1; $i <= count($array1); $i++) { 
     if(isset($array1[$i])){ 
      $newarray[$array2[$i-1]] = $array1[$i]; 
     } 
    } 

    var_dump($newarray); 
+0

Testé et fonctionne. – Zyre

0
<?php 
$a = "a74b8c0d3845e7"; 
preg_match_all("/[\d]+/", $a, $numbers); 
preg_match_all("/[a-z]+/i", $a, $strings); 
$c=array_combine($strings[0],$numbers[0]); 
print_r($c); 

Check it here.

+0

Je l'essaie et en réalité rien ne s'imprime. – Zyre

+0

son fonctionnement vérifier [ici] (http://3v4l.org/mQBLo) J'espère que vous utilisez PHP v5 + –

+0

Désolé, mon erreur. Ça marche. – Zyre

Questions connexes