2010-08-15 3 views
0

Quelqu'un peut-il me montrer comment mapper correctement? J'essaie de comprendre comment utiliser php explode() et d'organiser les valeurs de manière à pouvoir les récupérer et les imprimer dans un contexte organisé. Pour chaque enregistrement, je veux mettre un nom = valeur dans un compartiment particulier. J'ai (7) max seaux par enregistrement. Parfois, j'ai des dossiers qui ne remplissent pas chaque seau. (Par exemple, enregistrement (2) manque d'attributs (5,6,7) et enregistrement (3) est absent attribut (4)).aide à l'aide de php explode() et l'organisation de sortie

1-Column=host1.colo.sub;2-Column=Fri Aug 13;3-Column=db9.nfl.colo2.;4-Column=00:00:03;5-Column=01:55:02;6-Column=87.24 MB;7-Column=Success; 
1-Column=host1.colo.sub;2-Column=Fri Aug 13;3-Column=pdb2.colo2.;4-Column=04:00:02; 
1-Column=host1.colo.sub;2-Column=Fri Aug 13;3-Column=gl3_lvm;5-Column=04:48:06;6-Column=54.64 MB;7-Column=Success; 

Jusqu'à présent, j'écrit ceci pour voir ma sortie:

<?php 
$InputFile = file("test.txt"); 
foreach ($InputFile as $line){ 
    $pieces = explode(";", $line); 
     //print $pieces[0]; 
     //print $pieces[1]; 
     //print $pieces[2]; 
     print $pieces[3]; 
     //print $pieces[4]; 
     //print $pieces[5]; 
     //print $pieces[6]; 
//print_r($line); 
} 
?> 

Je voudrais imprimer des valeurs similaires pour chaque attribut au lieu de celui-ci où son mélange. Utilisation de 'print $ pieces [3];'

4-Column=00:00:034-Column=04:00:025-Column=04:48:06 
+0

Quelle sortie vous attendez? – timdev

+0

hi timdev, je voudrais que chacune des colonnes (1-7) agisse comme en-tête pour une table, alors les valeurs seront les lignes. s'il nous manque des colonnes 4, ou 5 ou 6, il imprimera une cellule vide ou vide. J'espère que cela à du sens. Imaginez simplement ces données dans un tableau simple. Merci. – cjd143SD

Répondre

2
$InputFile = file("test.txt"); 
foreach ($InputFile as $line){ 
    preg_match('~(1-Column[^;]*;?)?(2-Column[^;]*)?;?(3-Column[^;]*)?;?(4-Column[^;]*)?;?(5-Column[^;]*)?;?(6-Column[^;]*)?;?(7-Column[^;]*)?;?~',$line,$pieces); 
    $pieces = array_pad($pieces,8,''); 
    echo "<pre>";print_r($pieces);echo "</pre>"; 

} 

sortie:

Array 
(
    [0] => 1-Column=host1.colo.sub;2-Column=Fri Aug 13;3-Column=db9.nfl.colo2.;4-Column=00:00:03;5-Column=01:55:02;6-Column=87.24 MB;7-Column=Success; 
    [1] => 1-Column=host1.colo.sub; 
    [2] => 2-Column=Fri Aug 13 
    [3] => 3-Column=db9.nfl.colo2. 
    [4] => 4-Column=00:00:03 
    [5] => 5-Column=01:55:02 
    [6] => 6-Column=87.24 MB 
    [7] => 7-Column=Success 
) 

Array 
(
    [0] => 1-Column=host1.colo.sub;2-Column=Fri Aug 13;3-Column=pdb2.colo2.;4-Column=04:00:02; 
    [1] => 1-Column=host1.colo.sub; 
    [2] => 2-Column=Fri Aug 13 
    [3] => 3-Column=pdb2.colo2. 
    [4] => 4-Column=04:00:02 
    [5] => 
    [6] => 
    [7] => 
) 

Array 
(
    [0] => 1-Column=host1.colo.sub;2-Column=Fri Aug 13;3-Column=gl3_lvm;5-Column=04:48:06;6-Column=54.64 MB;7-Column=Success; 
    [1] => 1-Column=host1.colo.sub; 
    [2] => 2-Column=Fri Aug 13 
    [3] => 3-Column=gl3_lvm 
    [4] => 
    [5] => 5-Column=04:48:06 
    [6] => 6-Column=54.64 MB 
    [7] => 7-Column=Success 
) 
+0

c'est cool. Merci! preg_match semble être un meilleur ajustement. C'est exactement ce que j'envisage. – cjd143SD

+0

et si je veux supprimer les préfixes de nombre pour chaque colonne? à partir de '1 colonne' -> 'Colonne', '2 colonnes' -> 'Colonne'. Pouvons-nous rester avec preg_match? Merci. – cjd143SD

+0

yup. peut simplement déplacer le n- en dehors du groupe capturé (en le plaçant dans son propre groupe optionnel non-capturé) preg_match ('~ (?: 1 -)? (Colonne [^;] * ;?)? (?: 2-) (Colonne [^;] *)?;? (?: 3 -)? (Colonne [^;] *)?;? (?: 4 -)? (Colonne [^;] *)?;? (?: 5 -)? (Colonne [^;] *)?;? (?: 6 -)? (Colonne [^;] *)?;? (?: 7 -)? (Colonne [^;] *) ?;? ~ ', $ ligne, $ pièces); –

0

Si vos données d'entrée est si irrégulière que vous soit besoin d'analyser avec un peu plus de code, et pas seulement d'une simple explosion, ou le préparer pour qu'il fonctionne comme prévu avec exploser.

Dans le second cas, vous pouvez utiliser strpos pour trouver tout ";" caractères dans la chaîne et vérifier si le nombre après eux est en ordre. Si un numéro (ou plus) a été ignoré, vous devez compenser en insérant un autre ";". De cette façon, exploser va créer un élément de tableau vide et tous les tableaux qui en résultent doivent être alignés.

0

Bien que ce que vous essayez d'accomplir ne soit pas clair, nous espérons que ce code vous aidera à comprendre ce qui se passe.

Notez que ici, j'ai ajouté une autre boucle dans la principale foreach, itérer sur chaque paire nom/valeur dans la ligne:

<?php 
$InputFile = file("test.txt"); 
$lineCnt = 0; 
foreach ($InputFile as $line){ 
    $lineCnt++; 
    echo "Processing line #" . $lineCnt. "\n"; 
    $pieces = explode(";", $line); 
    foreach($pieces as $pair){ 
    $pair = explode('=',$pair); 
     if (!empty($pair[1])){ 
      print "\t".$pair[0] .' = ' . $pair[1] . "\n"; 
     } 
    } 

} 

Le script produira une sortie de belle apparence si elle est exécutée à partir de la ligne de commande. Si vous l'exécutez dans le navigateur, vous voudrez peut-être changer les \ n à
, et les \ t à   ou quelque chose.

0

Voir si cela aide ...

$splits = explode(';',$_POST['data']); 
foreach($splits as $id => $item) { 
    preg_match('/(.*?)=(.*)/',$item, $matches); 
    $parts[$matches[1]][] = $matches[2]; 
} 
print_r($parts); 

Cela vous donnera un tableau avec les clés comme 1-colonne, 2 colonnes comme ainsi de suite qui contiendra un tableau de valeur correspondante. Vous pouvez imprimer ce tableau de la manière que vous voulez.

Voici la sortie:

[1-Column] => Array 
    (
     [0] => host1.colo.sub 
     [1] => host1.colo.sub 
     [2] => host1.colo.sub 
    ) 

[2-Column] => Array 
    (
     [0] => Fri Aug 13 
     [1] => Fri Aug 13 
     [2] => Fri Aug 13 
    ) 

[3-Column] => Array 
    (
     [0] => db9.nfl.colo2. 
     [1] => pdb2.colo2. 
     [2] => gl3_lvm 
    ) 

[4-Column] => Array 
    (
     [0] => 00:00:03 
     [1] => 04:00:02 
    ) 

[5-Column] => Array 
    (
     [0] => 01:55:02 
     [1] => 04:48:06 
    ) 

[6-Column] => Array 
    (
     [0] => 87.24 MB 
     [1] => 54.64 MB 
    ) 

[7-Column] => Array 
    (
     [0] => Success 
     [1] => Success 
    ) 
+0

Merci @aadravid. Est-ce que 'data' est mon $ Inputfile? Comment puis-je passer dans le fichier texte? Merci. – cjd143SD

+0

vos données peuvent être n'importe quoi ... il suffit de remplacer $ _POST ['data'] avec la variable dans laquelle vous avez lu vos données. Vous pouvez utiliser file ("test.txt") comme suggéré par timdev pour lire votre fichier. –

+0

votre quantificateur gourmand (.*) fera en sorte que le premier match correspondra à tout le reste de la chaîne. Et pendant que nous y sommes, mieux vaut se débarrasser du quantificateur paresseux. Mieux vaut utiliser des classes de caractères négatives/([^ =] *) = ([^;] *)/ –