使用增量循环以有序方式访问多维,无序,关联数组

时间:2013-07-08 23:06:44

标签: php arrays csv dictionary

这主要是一个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()语句!

鉴于它是一个非常具体的用例,但它是我之前看到的关于序列化数组的东西 - 并且经常发现它们实际上是嵌套的。

我发布了一个可能的解决方案,但很乐意看到其他人。 (过去当我做过类似的事情时,我从未接受过自己的答案;))我确信必须有比我设计的方式更优雅的方式......!

2 个答案:

答案 0 :(得分: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

当然,如果需要,可以轻松更改此订单。但确实如此:

  • 要求专门使用数组作为索引
  • 只需要使用两个循环来初始化
  • 总共使用了四个额外数组

答案 1 :(得分: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