2015-09-19 1 views
6

I have a simple text-block; e, il suo contenuto è:Come analizzare questo semplice blocco di testo in un array multidimensionale, in PHP?

 txt_1(val_1,val_2,val_3). 
    txt_1(val_4,val_5,val_6). 
    txt_2(val_7,val_8,val_9). 
    txt_3(val_10,val_11,val_12). 
    txt_3(val_13,val_14,val_15). 
    txt_4(val_16,val_17,val_18).

E, c'è già una matrice semplice, in codice PHP:

$my_array = array(); 

Ora, voglio analizzare in questo array PHP, come:

Array 
(
    [txt_1] => Array 
     (
      [0] => Array 
       (
        [0] => val_1 
        [1] => val_2 
        [2] => val_3 
       ) 

      [1] => Array 
       (
        [0] => val_4 
        [1] => val_5 
        [2] => val_6 
       ) 

     ) 

    [txt_2] => Array 
     (
      [0] => Array 
       (
        [0] => val_7 
        [1] => val_8 
        [2] => val_9 
       ) 

     ) 

    [txt_3] => Array 
     (
      [0] => Array 
       (
        [0] => val_10 
        [1] => val_11 
        [2] => val_12 
       ) 

      [1] => Array 
       (
        [0] => val_13 
        [1] => val_14 
        [2] => val_15 
       ) 

     ) 

    [txt_4] => Array 
     (
      [0] => Array 
       (
        [0] => val_16 
        [1] => val_17 
        [2] => val_18 
       ) 

     ) 

) 

Tutti i dati sono generale. Potresti aiutarmi a farlo, con PHP?

risposta

1
$input = 'txt_1(val_1,val_2,val_3). 
     txt_1(val_4,val_5,val_6). 
     txt_2(val_7,val_8,val_9). 
     txt_3(val_10,val_11,val_12). 
     txt_3(val_13,val_14,val_15). 
     txt_4(val_16,val_17,val_18).'; // the input string 

$temp = explode('.', $input); // seprates from . 
$temp = array_filter($temp); // for cutting blank values 
$temp = array_map('trim', $temp); // removes newlines 

$final = []; 

foreach($temp as $val) 
{ 
    $key = strtok($val, '('); // search upto token (
    $final[$key][] = explode(',' ,strtok(')')); // advance token to) 
} 

unset($val, $temp); // unset non required things 

Ecco l'output per $final,

Array 
(
    [txt_1] => Array 
     (
      [0] => Array 
       (
        [0] => val_1 
        [1] => val_2 
        [2] => val_3 
       ) 

      [1] => Array 
       (
        [0] => val_4 
        [1] => val_5 
        [2] => val_6 
       ) 

     ) 

    [txt_2] => Array 
     (
      [0] => Array 
       (
        [0] => val_7 
        [1] => val_8 
        [2] => val_9 
       ) 

     ) 

    [txt_3] => Array 
     (
      [0] => Array 
       (
        [0] => val_10 
        [1] => val_11 
        [2] => val_12 
       ) 

      [1] => Array 
       (
        [0] => val_13 
        [1] => val_14 
        [2] => val_15 
       ) 

     ) 

    [txt_4] => Array 
     (
      [0] => Array 
       (
        [0] => val_16 
        [1] => val_17 
        [2] => val_18 
       ) 

     ) 

) 
2
<?php 

// Initially put your input into a variable 
$txt=<<<__EOT__ 
txt_1(val_1,val_2,val_3). 
txt_2(val_4,val_5,val_6). 
txt_n(val_a,val_b,val_c). 
__EOT__; 

$result = array(); 

// separate out each row 
$rows = explode("\n", $txt); 

    // loop through each row 
    foreach($rows as $row) { 

    // Use a regular expression to find the key and values 
    $success = preg_match('/^([^(]+)\(([^)]+)\)\.$/', $row, $parts); 

    // Check the regexp worked 
    if(!$success) { 
     echo 'Failed to match row: ' . $row . "\n"; 
     continue; 
    } 

    // get the array key from the regexp results 
    $key = $parts[1]; 

    // the values are all a string, split on the comma to make an array 
    $values = explode(',', $parts[2]); 

    // store $key and $values in the result 
    $result[$key] = $values; 

} 

// See if it worked 
var_dump($result); 
+0

hai testare la risposta? –

1

test qui: http://phptester.net/

NOTA: Per poter utilizzare la sintassi array di breve [] utilizzare PHP 5,4

<?php 

$text = " 
     txt_1(val_1,val_2,val_3). 
     txt_2(val_4,val_5,val_6). 
     txt_n(val_a,val_b,val_c). 
     "; 

$myArray = []; 

//You're gonna see why we want to remove this character 
//later, it will help us have a cleaner code. 
$text = str_replace(')', '', $text); 

$arrayGroup = explode('.', $text); 

//print_r($arrayGroup); 

foreach($arrayGroup as $array) { 
    $exp = explode('(', $array);  
    $arrayName = trim($exp[0]); 
    $arrayValues = explode(',', $exp[1]); 

    foreach($arrayValues as $value) { 
     ${$arrayName}[] = $value; 
    } 

    $myArray[$arrayName] = $$arrayName; 
} 

echo '<pre>'; 
print_r($myArray); 
echo '</pre>'; 

echo '<pre>'; 
print_r($myArray['txt_2']); 
echo '</pre>'; 

Dopo tutto questo, è possibile utilizzare il txt_1 o txt_2 o qualsiasi altra cosa dopo, perché le variabili sono state create dinamicamente.

Più avanti nel codice è possibile utilizzare senza alcun problema $myVar = txt_1[3];

2
Suppose this answer will help you 

    $text = " 
    txt_1(val_1,val_2,val_3). 
    txt_2(val_4,val_5,val_6). 
    txt_3(val_a,val_b,val_c). 
    "; 

    $myArry = explode(".", $text); 
    $resArry = array(); 

    foreach ($myArry as $key => $value) { 
     if(trim($value)!=""){ 
      $plain = str_replace(array("(",")"),",",$value); 
      $subArry = explode(",",$plain); 

      $keyN = explode("(",trim($value)); 
      unset($subArry[array_search($keyN[0],$subArry)]); 
      unset($subArry[array_search("",$subArry)]); 
      $resArry[$keyN[0]][]=$subArry;  
     } 

    } 

    echo "<pre/>"; 
    print_r($resArry); 
    die; 

    //Output will be like 
Array 
(
    [txt_1] => Array 
    (
     [0] => Array 
      (
       [1] => val_1 
       [2] => val_2 
       [3] => val_3 
      ) 

    ) 

    [txt_2] => Array 
    (
     [0] => Array 
      (
       [1] => val_4 
       [2] => val_5 
       [3] => val_6 
      ) 

    ) 

[txt_3] => Array 
    (
     [0] => Array 
      (
       [1] => val_a 
       [2] => val_b 
       [3] => val_c 
      ) 

    ) 

) 
+0

@Viral penso che questa risposta funzioni anche per array dinamici come ** txt_1 (val_1, val_2, val_3). txt_1 (val_4, val_5, val_6). txt_2 (val_7, val_8, val_9). txt_3 (val_10, val_11, val_12). txt_3 (val_13, val_14, val_15). txt_4 (val_16, val_17, val_18). ** –

Problemi correlati