2015-09-19 50 views
6

我有一個簡單文本塊;並且,它的內容是:如何在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).

而且,已經有一個簡單的數組,在PHP代碼:

$my_array = array(); 

現在,我想分析這個PHP數組,如:

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 
       ) 

     ) 

) 

所有數據是一般。你能幫我做到這一點,用PHP?

回答

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 

這裏是輸出$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

你測試的答案嗎? –

1

測試在這裏:http://phptester.net/

注:爲了使用短數組語法[]使用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>'; 

這一切後,你可以使用txt_1或txt_2或之後的任何內容,因爲變量是動態創建的。

稍後在代碼中你可以使用$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我認爲這個答案也適用於動態數組,如** 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)。** –