2011-02-05 3 views
1

J'ai une chaîne contenant un peu de données. Je veux diviser les données en un tableau 2D. Les données de la chaîne sont séparées par un ~ (tilde) pour les colonnes et un: (deux-points) pour les différentes lignes. Un exemple de chaîne pourrait être: "Londres ~ 10 ~ 20 ~ froid: New York ~ 23 ~ 53 ~ chaud: Madrid ~ 43 ~ 12 ~ sec".PHP: Séparer une chaîne en un tableau 2D

Merci.

+0

Pouvez-vous donner un exemple de ce que le résultat devrait être? – Ikke

+0

qu'est ce qu'un tableau 2D? Pouvez-vous donner un exemple ? Voulez-vous dire ceci: '$ arr [premier] [deuxième]' – Eray

+0

duplication possible de [PHP - Loopless façon de diviser une chaîne en un tableau multidimensionnel] (http://stackoverflow.com/questions/1948217/php-loopless- way-to-split-a-string-into-a-multidimensionnel-array) – hakre

Répondre

8
$string = "London~10~20~cold:New York~23~53~hot:Madrid~43~12~dry"; 
$array = explode(':', $string); 
foreach($array as &$value) $value = explode('~', $value); 
+0

Brillant. Je vous remercie. Si ma chaîne devait commencer par un ':' comment j'arrêterais la première ligne du tableau vide? – Joseph

+0

supprime le deux-points 'if ($ string [0] == ':') $ string = sous-chaîne ($ string, 1);', ou supprime la ligne vide 'if (count ($ array) &&! Strlen ($ array [0] [0])) $ array = array_slice ($ array, 1); '(éditer vide pas bon, changé en approche strlen) – yankee

3

manière fonctionnelle (PHP 5.3.x nécessaire):

$string = "London~10~20~cold:New York~23~53~hot:Madrid~43~12~dry"; 
$map = array_map(function($el) { 
    return explode('~', $el); 
}, explode(':', $string)); 
+0

Je le creuse. (remplisseur) – erisco

0

Vous pouvez diviser les données en php avec explode(). Donc d'abord vous devez diviser la chaîne, que vous devez diviser vos entrées à nouveau avec explode().

$data = explode(':', $string); 
$array = array(); 
foreach($data as $d) { 
    $d = explode('~', $d); 
    $array[] = $d; //e.g. $array[0][0] --> London 
    //$array[$d[0]] = array('temperature' => $d[1], 'dont-know' => $d[2], 'climate' => $d[3]); //e.g. $arra['London'] => array(...) 
} 
0

Un style

$array = array_map(function($value) { 
return explode('~', $value); 
}, explode(':',$string);); 
3

"fonctionnelle" Une autre alternative serait:

preg_match_all('/(.*?)~(.*?)~(.*?)~(.*?)(?:$|:)/', $string, $array, 
PREG_SET_ORDER); 

Il est plus lourd dans ce que vous devez prédéfinir le format de la colonne. Il renvoie également la correspondance complète dans chaque ligne [0]. Sinon (en raison de PREG_SET_ORDER) il est dans votre format 2d désiré. Il suffit de l'afficher ici pour plaire et agacer les micro-stimulateurs en même temps. Malgré le mème Stackoverflow commun, la regex est trois fois plus rapide que la boucle explosive.

+0

COuld ne crois pas que sur la vitesse. Et testé. Eh bien, vous avez raison à ce sujet. Bien que le format ne soit pas exactement correct puisque $ array [x] [0] contient la ligne complète qui n'est pas désirée. De plus, votre solution est moins lisible je pense. Quoi qu'il en soit, merci de signaler cela à propos de la performance ... – yankee