2014-10-05 32 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

相关问题