2014-10-05 34 views
-1

早上好!將帶有數據的月份字符串轉換爲二維數組

我有一個字符串,每個月有幾個月份,然後是一系列數字。我需要將該字符串分解爲二維數組:第一列中的月份和後面的數字列。

我已經制定了一些解決方案,使用strtok,爆炸和一個月的查找表。但我的解決方案看起來非常麻煩。我將不勝感激一個優雅,簡單的解決方案,即具有一定真實代碼體驗的人將使用。我的字符串,希望下面的二維數組結果。

謝謝你的專業知識和時間!

12月14 1938.50 1964.50 1935.75 1959.75 21.75 1960.25 1551405 2751445 03月15 1931.00 1956.2 1928.0 1952.0 21.75 1952.50 2244 5495 06月15 1920.25 1949.0 1920.25 1945.0 22.00 1945.50 88 350 09月15 1925.00 1937.7 1925.00 1937.7 21.75 1938.75 6 204年12月15 1935.75 1935.75 1935.75 1935.75 22.00 1932.75 1 212

結束是: 12月14日1938.50 1964.50 1935.75 1959.75 21.75 1960.25 1551405 2751445 3月15日1931.00 1956.2 1928.0 1952.0 21.75 1952.50 2244 5495 等等

+0

哪種編程語言?你使用'explode'標籤,所以我認爲它是PHP,但你應該明確地指定它。 – lxg 2014-10-05 22:18:57

+0

列數總是10嗎?或者有時會有更多或更少的列? – lxg 2014-10-05 22:21:15

+0

謝謝你的提醒lxg!是的,你是對的。 PHP。並且可能有更多或更少的行和列。但基本的字符串結構保持不變。三個字母的月份,然後是數據。三個字母的月份代碼保持不變。 – expertalmost 2014-10-06 00:31:43

回答

0

下應該做的伎倆:

$data = "DEC 14 1938.50 1964.50 1935.75 1959.75 21.75 1960.25 1551405 2751445 MAR 15 1931.00 1956.2 1928.0 1952.0 21.75 1952.50 2244 5495 JUN 15 1920.25 1949.0 1920.25 1945.0 22.00 1945.50 88 350 SEP 15 1925.00 1937.7 1925.00 1937.7 21.75 1938.75 6 204 DEC 15 1935.75 1935.75 1935.75 1935.75 22.00 1932.75 1 212"; 

$dataArray = preg_split('|\s+|', $data); 
$table = array(); 
$idx = -1; // -1 because the first array index should be 0 

foreach ($dataArray as $elem) 
{ 
    if (preg_match('|^[A-Z]{3}$|', $elem)) 
    { 
     $table[++$idx] = array('month' => $elem, 'values' => array()); 
    } 
    elseif (isset($table[$idx])) // in case the first word is not a month 
    { 
     $table[$idx]['values'][] = $elem; 
    } 
} 

這給出了以下結果:

Array 
(
    [1] => Array 
     (
      [month] => DEC 
      [values] => Array 
       (
        [0] => 14 
        [1] => 1938.50 
        [2] => 1964.50 
        [3] => 1935.75 
        [4] => 1959.75 
        [5] => 21.75 
        [6] => 1960.25 
        [7] => 1551405 
        [8] => 2751445 
       ) 

     ) 

    [2] => Array 
     (
      [month] => MAR 
      [values] => Array 
       (
        [0] => 15 
        [1] => 1931.00 
        [2] => 1956.2 
        [3] => 1928.0 
        [4] => 1952.0 
        [5] => 21.75 
        [6] => 1952.50 
        [7] => 2244 
        [8] => 5495 
       ) 

     ) 

    … 
) 

注意:一個簡單的陣列結構,用一個月的關鍵,是行不通的,因爲有些個月的多次出現(例如DEC),並且值將被覆蓋。

+0

哇!謝謝lxg。太精彩了。我不知道你可以命名正則表達式並像那樣使用它們。 不幸的是,行:$ table = [];產生一個PHP錯誤,「意外[」我假設這是數組的聲明。我已經嘗試了幾種替代方案,但是在該行或$ table [++ $ idx] ...行中出現錯誤。 我錯過了什麼? 再次感謝您的指導和專業知識:) – expertalmost 2014-10-06 14:41:06

+0

對,這是一個替代PHP> = 5.4的數組表示法。我已將其重寫爲經典記號,請再試一次。 – lxg 2014-10-06 14:55:17

+0

這是我嘗試的第一件事。它仍然在$ table [++ $ idx] ...行上出錯。所以我試過:$ table [] = array();也出現了錯誤。但是,無論如何我都運行了代碼並且工作。雙向!所以它看起來像是在我的舊PHPEdit編輯器中拋出錯誤。哎喲!而且,你的代碼的工作原理也是如此。意外。我想在這一點上,任何建議的開源PHP編輯器將不勝感激。 ;)再次感謝lgx的熟練代碼和教育。 – expertalmost 2014-10-06 15:24:12

相關問題