2015-09-06 31 views
1

我有一個包含數組列表的文本文件:如何轉換的文本文件陣列的列表爲實際陣列在PHP

'1920s' => array('20s','twenties') 
'1930s' => array('30s','thirties') 
'1940s' => array('40s','forties') 
'1950s' => array('50s','fifties') 

我想導入爲數組的數組,像這樣:

Array 
(
    [1920s] => Array 
     (
      [0] => 20s 
      [1] => twenties 
     ) 

    [1930s] => Array 
     (
      [0] => 30s 
      [1] => thirties 
     ) 

    [1940s] => Array 
     (
      [0] => 40s 
      [1] => forties 
     ) 

    [1950s] => Array 
     (
      [0] => 50s 
      [1] => fifties 
     ) 

) 

我導入文件:

$decadesFile = file_get_contents('/Users/derwood/capsule/decades.txt'); 
$decades = explode("\r",$decadesFile); 

,但我得到的文本行的數組:

Array 
(
    [0] => '1920s' => array('20s','twenties') 
    [1] => '1920s' => array('20s','twenties') 
    [2] => '1940s' => array('40s','forties') 
    [3] => '1950s' => array('50s','fifties') 

除了「file_get_contents」和「explode」我還有其他的組合嗎?

編輯:我確實閱讀了列出的答案,但文本文件是由FMP數據庫生成的,而不是print_r輸出,所以憑藉我有限的經驗,我不認爲問題是重複的。然而,這裏的鏈接問題和答案對於說明它們之間的關係非常有幫助。謝謝。

回答

1

我肯定在每一行的正則表達式可能是一個更好的解決方案,但使用爆炸,假設文件的內容的緣故在$文件

$lines = explode("\n",$file); 
foreach($lines as &$line){ 
    $line = explode("'",$line); 
    $output[$line[1]][0] = $line[3]; 
    $output[$line[1]][1] = $line[5]; 
} 
unset($lines); 
var_dump($output); 
+0

第1行丟失分號。 –

+0

@theFX謝謝你:) – georoot

+0

這照顧了它。我不得不增加幾行輸出來解釋更長的記錄,但它的工作。謝謝。 :) –

0

print_r功能不好功能節省陣列。使用json_encodevar_export

見print_r_reverse功能:Recreate original PHP array from print_r output

function print_r_reverse($in) { 
    $lines = explode("\n", trim($in)); 
    if (trim($lines[0]) != 'Array') { 
     // bottomed out to something that isn't an array 
     return $in; 
    } else { 
     // this is an array, lets parse it 
     if (preg_match("/(\s{5,})\(/", $lines[1], $match)) { 
      // this is a tested array/recursive call to this function 
      // take a set of spaces off the beginning 
      $spaces = $match[1]; 
      $spaces_length = strlen($spaces); 
      $lines_total = count($lines); 
      for ($i = 0; $i < $lines_total; $i++) { 
       if (substr($lines[$i], 0, $spaces_length) == $spaces) { 
        $lines[$i] = substr($lines[$i], $spaces_length); 
       } 
      } 
     } 
     array_shift($lines); // Array 
     array_shift($lines); // (
     array_pop($lines); //) 
     $in = implode("\n", $lines); 
     // make sure we only match stuff with 4 preceding spaces (stuff for this array and not a nested one) 
     preg_match_all("/^\s{4}\[(.+?)\] \=\> /m", $in, $matches, PREG_OFFSET_CAPTURE | PREG_SET_ORDER); 
     $pos = array(); 
     $previous_key = ''; 
     $in_length = strlen($in); 
     // store the following in $pos: 
     // array with key = key of the parsed array's item 
     // value = array(start position in $in, $end position in $in) 
     foreach ($matches as $match) { 
      $key = $match[1][0]; 
      $start = $match[0][1] + strlen($match[0][0]); 
      $pos[$key] = array($start, $in_length); 
      if ($previous_key != '') $pos[$previous_key][1] = $match[0][1] - 1; 
      $previous_key = $key; 
     } 
     $ret = array(); 
     foreach ($pos as $key => $where) { 
      // recursively see if the parsed out value is an array too 
      $ret[$key] = print_r_reverse(substr($in, $where[0], $where[1] - $where[0])); 
     } 
     return $ret; 
    } 
} 
0

什麼你在編程行話談論的是「數據序列化」

https://en.m.wikipedia.org/wiki/Serialization

大多數成熟的編程語言給序列化的數據類型的方法所以他們可以被存儲(文件,內存,緩存服務器等),並在以後重新創建,甚至在不同的服務器上。

你應該使用PHP的序列化的方法來將數據保存到文件和反序列化,以將數據返回到範圍

http://php.net/manual/en/function.serialize.php http://php.net/manual/en/function.unserialize.php

你可以使用JSON爲好,但它限制什麼可以做比較使用PHP的內置序列化引擎