0

这主要是一个 PHP 答案,但该方法实际上可能与语言无关。

通过一个简单的解析器运行 CSV 文件后,我得到了一个类似于以下内容的多维数组:

array( 'estimated' =>
  array( 
    array( "TITLE" => 'MAIN', "CURR_PERF" => 100, "POT_PERF" => 75 ),
    array( "TITLE" => 'HEAT', "CURR_PERF" => 90, "POT_PERF" => 60 ),
    array( "TITLE" => 'CO2', "CURR_PERF" => 56, "POT_PERF" => 40 ),
  ),

 'actual' => 
   array(
    array( "TITLE" => 'MAIN', "CURR_PERF" => 100, "POT_PERF" => 75 ),
    array( "TITLE" => 'HEAT', "CURR_PERF" => 89 , "POT_PERF" => 75),
    array( "TITLE" => 'CO2', "CURR_PERF" => 40, "POT_PERF" => 20 ),
   );
);

现在,一方面是可怕的数据结构,而无需重构底层解析器——如何确保您可以按特定顺序访问这些数据结构的最佳方式是什么?不必触及底层解析器?

如果您使用for()/foreach()循环进行循环,您将只能以线性顺序读取它们 - 增加或减少元素。您不一定能够深入挖掘并获得所需的特定值。

例如,CSV 文件可以estimated以与 ; 的值不同的顺序表达actual; 并且可能需要以另一种顺序输出它们。

例如,这是我脑海中浮现的三个不同的命令:

-> MAIN HEAT CO2
-> HEAT MAIN CO2
-> CO2  HEAT MAIN

此外,通常情况下,CSV 文件中的标签名称并不完全是用户友好的 - 因此需要将它们“翻译”(如果您愿意)成更人性化的东西。当然,最好不要使用大量if()语句!

鉴于这是一个非常具体的用例,但这是我以前见过的关于被序列化的数组的东西——并且经常发现它们实际上是嵌套的。

我已经发布了一种可能的解决方案,但很高兴看到其他解决方案。(过去,当我做过类似的事情时,我从来没有接受过自己的答案;))我确信一定有一种比我设计的更优雅的方式..!

4

2 回答 2

0

这是我当时能想到的最快(也是最简洁)的解决方案,但这并不是我非常自豪的解决方案..!它涉及多个循环,使用多个数组,并且似乎是一种过度设计的机制来做一些肯定很简单的事情?

首先,我创建了一个关联数组,用作字典来查找在 CSV 文件中找到的文本字符串的翻译:

$tbl = array( "MAIN"=>"Main Costs",
  "TOTAL"=>"Total Costs",
  "CO2"=>"Gas expended" );

接下来,我创建了一个数组以用作“索引” - 我key按照我希望在应用程序中访问它们的顺序在此处输入值:

$index = array( "MAIN", "TOTAL", "CO2" );

然后我创建了两个空白数组并用子数组中的数据填充它们,通过使用循环我能够使它们具有关联性 - 允许我指定使用TITLE字段作为键:

$estimated = array();
$actual = array();

foreach( $bills['estimated'] as $bill ){
  $estimated[ $bill['title'] ] = $bill;
}
foreach( $bills['actual'] as $bill ){
  $actual[ $bill['title'] ] = $bill;
}

通过这样做,我可以按特定顺序遍历它们,而不管它们被解析的顺序如何,如下所示:

 for($i=0; $i<3; $i++){
   $bill = $estimated[ $index[ $i ] ];
   printf(" %s: %d ", $tbl[ $index[ $i ] ], $bill['CURR_PERF'] );
}

它将按照我指定的顺序输出以下内容:

// 1. Main Costs: 100
// 2. Total Costs: 90
// 3. Gas Expended: 56

当然,如果需要,可以轻松更改此顺序。但是它确实:

  • 需要专门使用数组作为索引
  • 只需使用两个循环来初始化
  • 总共使用了四个额外的数组
于 2013-07-08T23:06:43.980 回答
0

如果将此数组分配给变量,$ary例如:

$ary = array(
  'estimated' =>
    array( 
      array('TITLE' => 'MAIN', 'CURR_PERF' => 100, 'POT_PERF' => 75),
      array('TITLE' => 'HEAT', 'CURR_PERF' => 90, 'POT_PERF' => 60),
      array('TITLE' => 'CO2', 'CURR_PERF' => 56, 'POT_PERF' => 40),
    ),
  'actual' => 
     array(
       array('TITLE' => 'MAIN', 'CURR_PERF' => 100, 'POT_PERF' => 75),
       array( 'TITLE' => 'HEAT', 'CURR_PERF' => 89 , 'POT_PERF' => 75),
       array( 'TITLE' => 'CO2', 'CURR_PERF' => 40, 'POT_PERF' => 20 ),
     );
);

您的estimated数组可以像这样访问:

$newVar = $ary['estimated'][2]['CURR_PERF'];

$newVar将是56。您也可以重新分配一个值,例如:

$ary['estimated'][0]['POT_PERF'] = 300;

数组中的第一个estimated数组曾经是75,现在是300

这就是您在多维数组中获取和设置特定值的方式。

要对数组进行排序,如果您需要循环并维护它们的索引,请参阅 PHP 的uasort()函数。就您而言,这可能需要一些工作来开发一个cmp_function,但应该以不同的方式完成您正在寻找的事情。

看,

http://www.php.net/manual/en/function.uasort.php

http://www.php.net/manual/en/function.usort.php ,

这解释cmp_function得更好。

于 2013-07-08T23:40:11.550 回答