2017-10-20 7 views
0

Dans une zone de texte, je suis coller données aléatoires suivant un modèle:PHP tableau et la valeur vide multidimensionnel

Data1 Data2 Data3 Data4 Data5 Data6 Data7 
Data8 Data9 Data10 Data11 Data12 Data13 Data14 

Comme:

nom

[4 * ESPACE] nom [4 * ESPACE] adresse [4 * ESPACE] pays [4 * ESPACE] téléphone [4 * ESPACE] le sexe [4 * ESPACE] ans [4 * ESPACE] [saut de ligne]

Et dans ce modèle, les dernières données (âge ici) peut être vide.

J'ai donc fait:

<form> 
    <textarea rows="15" cols="100" name="query" id="pastedata">Paste datas there.</textarea> 
    <p style="margin-left: 320px;"><input type="submit" name="submit"value="Submit" /></p> 
</form> 

<?php 


if(isset($_GET['query'])) { 
    $query = $_GET['query']; 
$query = str_replace(' ', ',', $query); 
$query = str_replace("\n", ',', $query); 
$info = explode (',', $query); 
$result = array_map('trim', $info); 
print_r(array_chunk($result, 7)); 
} 

Il fait son travail ... PHP retourne un tableau multidimensionnel suivant le modèle de 7 colonnes, sauf si les dernières données est vide il se déplacera la première ligne de la rangée suivante .

Comment puis-je dire à PHP que si dans un tableau la dernière valeur est vide, alors retourner juste quelque chose comme «Données vides»?

Ceci est mes premières lignes PHP donc je suis sûr que la structure est cassée.


EDIT: Merci beaucoup à tous, ça marche maintenant comme prévu!

+0

Pouvez-vous donner un exemple de résultat que vous cherchez? –

+0

juste appliquer trim sur l'entrée? '$ query = trim ($ _ GET ['requête'])' – Philipp

Répondre

0

Il existe certainement des méthodes plus courtes pour cela, mais voici un exemple développé.

http://sandbox.onlinephpfunctions.com/code/04507d4c64b2b0d53c6f490b1484e4b4bf54b9b3

Modifier - logique ajoutée pour remplacer la valeur vide avec 'données vide'

<?php 
$output = []; 

$input = "Data1 Data2 Data3 Data4 Data5 Data6 \nData8 Data9 Data10 Data11 Data12 Data13 Data14\n"; 

// The preg_split with PREG_SPLIT_NO_EMPTY will ignore any empty lines. 
// http://php.net/manual/en/function.preg-split.php 
foreach (preg_split('/\n/', $input, -1, PREG_SPLIT_NO_EMPTY) as $line) { 

    $pieces = explode(' ', $line); 

    // Loop over pieces and check if it is empty. If so, replace it with a string. 
    $output[] = array_map(function($value) { 
     return trim($value) === '' ? 'Empty Data' : $value; 
    }, $pieces); 
} 

print_r($output); 
0

Il semble que vous souhaitiez diviser chaque enregistrement par un délimiteur de ligne. Dans ce cas, faites-le directement au lieu de réunir tous les enregistrements avant de les séparer.

De plus, vous pouvez exploser sur 4 espaces directement au lieu de convertir en virgule.

foreach (preg_split("/((\r?\n)|(\r\n?))/", $_GET['query']) as $line) { 
    $info = explode (' ', $query); 
    $result = array_map('trim', $info); 
    print_r(array_chunk($result, 7)); 
} 
0

Vous pouvez essayer ceci:

$input = "Data1 Data2 Data3 Data4 Data5 Data6 Data7 
Data8 Data9 Data10 Data11 Data12 Data13 
Data15 Data16 Data17 Data18 Data19 Data20 Data21"; 

parserInputData(explode("\n", $input)); 

function parserInputData(array $lines){ 
    $output = []; 

    foreach ($lines as $line) { 
     $query = $line; 
     $query = str_replace(' ', ',', $query); 
     $query = str_replace("\n", ',', $query); 
     $info = explode (',', $query); 
     $result = array_map('trim', $info); 
     $columnsCount = count($result); 

     if($columnsCount < 7){ 
      $diff = 7 - $columnsCount; 
      $result = array_merge($result, array_fill($columnsCount-1, $diff, 'Empty data')); 
     } 

     $output[] = $result; 
    } 

    print_r($output); 
} 

La sortie de ce code est

Array 
(
    [0] => Array 
     (
      [0] => Data1 
      [1] => Data2 
      [2] => Data3 
      [3] => Data4 
      [4] => Data5 
      [5] => Data6 
      [6] => Data7 
     ) 

    [1] => Array 
     (
      [0] => Data8 
      [1] => Data9 
      [2] => Data10 
      [3] => Data11 
      [4] => Data12 
      [5] => Data13 
      [6] => Empty data 
     ) 

    [2] => Array 
     (
      [0] => Data15 
      [1] => Data16 
      [2] => Data17 
      [3] => Data18 
      [4] => Data19 
      [5] => Data20 
      [6] => Data21 
     ) 

) 
0
<?php 

$_GET['query'] = 'Data1 Data2 Data3 Data4 Data5 Data6 Data7 
Data8 Data9 Data10 Data11 Data12 Data13 Data14'; 


if(isset($_GET['query'])) { 
    $query = $_GET['query']; 
    $query = explode(PHP_EOL, $query); 
    foreach($query as &$q){ 
     $q = trim($q); 
     $q = explode(' ', $q); 
    } 
var_dump($query); 
} 

première chaîne exploser à EOL que pour chaque espacements de finition en ligne et de les exploser sur [4 * espace]

ce sera le résultat:

array 
    0 => 
    array 
     0 => string 'Data1' (length=5) 
     1 => string 'Data2' (length=5) 
     2 => string 'Data3' (length=5) 
     3 => string 'Data4' (length=5) 
     4 => string 'Data5' (length=5) 
     5 => string 'Data6' (length=5) 
     6 => string 'Data7' (length=5) 
    1 => & 
    array 
     0 => string 'Data8' (length=5) 
     1 => string 'Data9' (length=5) 
     2 => string 'Data10' (length=6) 
     3 => string 'Data11' (length=6) 
     4 => string 'Data12' (length=6) 
     5 => string 'Data13' (length=6) 
     6 => string 'Data14' (length=6)