这主要是一个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()
语句!
鉴于它是一个非常具体的用例,但它是我之前看到的关于序列化数组的东西 - 并且经常发现它们实际上是嵌套的。
我发布了一个可能的解决方案,但很乐意看到其他人。 (过去当我做过类似的事情时,我从未接受过自己的答案;))我确信必须有比我设计的方式更优雅的方式......!
答案 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
。