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。さらに別の順序で出力する必要がある場合もあります。

たとえば、次の 3 つの注文が頭に浮かびます。

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

さらに、よくあることですが、CSV ファイル内のラベル名は正確にはユーザー フレンドリーではないため、(必要に応じて) より人間にわかりやすい名前に「変換」する必要があります。当然、必要にif()応じて多くのステートメントを使用する必要はありません。

これは非常に特殊な使用例ですが、シリアル化されている配列に関して以前に見たことがあり、実際にネストされていることがよくあります。

考えられる解決策を 1 つ投稿しましたが、他の解決策も見ていただければ幸いです。(過去に同様のことをしたとき、私は自分の答えを受け入れたことはありません;))私が考案した方法よりもエレガントな方法があるに違いないと確信しています..!

4

2 に答える 2

0

これは、当時その場で思いついた最も迅速な (そして最も適切な) 解決策でしたが、私が非常に誇りに思っている解決策ではありません..! 複数のループ、複数の配列の使用が含まれ、かなり単純化されているはずの何かを行うための過度に設計されたメカニズムのように見えますか?

まず、CSV ファイルで見つかったテキスト文字列の翻訳を検索するための辞書として使用する連想配列を作成しました。

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

次に、「インデックス」として使用する配列を作成しました。keyここに、アプリケーションでアクセスする順序で値を入力しました。

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

次に、2 つの空の配列を作成し、それらに子配列のデータを入力しました。ループを使用してそれらを連想させることができました。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

もちろん、この順序は必要に応じて簡単に変更できます。ただし、次のようになります。

  • 特にインデックスとして機能するために配列を使用する必要がある
  • 初期化するためだけに 2 つのループを使用する必要がある
  • 合計 4 つの余分な配列を使用します
于 2013-07-08T23:06:43.980 に答える