2017-11-27 26 views
0

シリアル化されたデータを行ベースの配列に変換するために、一見複雑すぎるコードを書いています。データベースクエリは変更できません。また、フォームにはデータベースを供給することもできません(どちらも旧式です)。したがって、既存のデータベース選択クエリによって提示される出力を処理する必要があります。私が書いたコード(下)は大丈夫ですが、ひどく複雑です。誰でもより効率的な方法のアイデアを考え出すことができますか?シリアル化されたデータを特定の配列構造に変換する

    //Database Select Queries generating one pair of month-cost rows for each property 
        $cost_amount_array[]=$row->cost_amount; //always a cost value and month returned by form 
        $cost_month_array[]=$row->cost_month; 

        //Serialized data outputs 
        $cost_amount_array[$p] = [cost_amount] => a:6:{i:0;s:3:"333";i:1;s:3:"111";i:2;s:3:"100";i:3;s:3:"200";i:4;s:3:"690";i:5;s:3:"777";} 
        $cost_month_array[$p]) = [cost_month] => a:6:{i:0;s:1:"9";i:1;s:2:"10";i:2;s:1:"8";i:3;s:1:"7";i:4;s:1:"6";i:5;s:1:"9";} 

      //Final Output Required: Feeds a grahic plug API.... 
       array 
       (
       array (month1, cost_amount 1) where the cost_amounts need to be summed due multiple if there are multiple form entries for a month 
       array (month2, cost_amount2) 
       etc 
       etc 
       ) 

最終アレイを生成するルーチン。

//Count the property entries in the $finance_array (output array). 
    //For each property unserialize the (synchronised) month - cost data and put data into a temp array 

       for ($p=0; $p<$count_finance_array; $p++) //for each record in array 
       { 
        $list_count=count(unserialize($cost_type_array[$p])) +$list_count; //grab the number of cost entries and cumulatively count them 
        $C[]=unserialize($cost_amount_array[$p]); 
        $D[]=unserialize($cost_month_array[$p]); 
       } 

       //Remove top level array wrapper 
        foreach($C as $array){  
         foreach($array as $key=>$value){ 
          //echo "KEY:".$key; 
          //echo "VAL:".$value; 
          $cost_amount_out[]=(int)$value; 
         } 
        } 

        foreach($D as $array){  
         foreach($array as $key=>$value){ 
          //echo "KEY:".$key; 
          //echo "VAL:".$value; 
          $cost_month_out[]=$value; 
         } 
        } 


     //Remove duplicate months and add up the corresponding cost values if a connected month with a cost-value is duplicated hence deleted 

        $month_cost_row = array_unique($cost_month_out);//returns just the unique values 
        $month_cost_row = array_combine($month_cost_row, array_fill(0, count($month_cost_row), 0));// 

        foreach($cost_month_out as $k=>$v) { 
         $month_cost_row[$v] += (int)$cost_amount_out[$k]; 
        } 

      //Make the key - which are the months - become the first values of each sub array (ie first value in each month/cost_value row) 
        $month_cost_row_sorted = array_map 
        (function($k, $v) 
        { 
        return array($k, $v); 
        }, 
        array_keys ($month_cost_row), $month_cost_row 
        ); 

      //Sort the rows by first value ie month (numerically ascend) 
        usort($month_cost_row_sorted, "cmp"); 
        //print "<pre>"; 
        //print_r($month_cost_row_sorted); 
        //print "</pre>"; 

        function cmp($X, $Y) { 
        return $X[0] - $Y[0]; 
        } 
         //print "<pre>"; 
         //print_r($month_cost_row_sorted); 
         //print "</pre>"; 

このルーチンは、必要な配列形式を生成します。しかし、それはとても複雑です。それは単純化できますか?

ps $ pは、データベース内の各行がプロパティを表す行の数です。すべてのコストと所得データはシリアル化されているため、各元帳ごとに、プロパティごとに1つのプロパティインスタンスが数百ではなく1つしかありません(コストエントリごとに1行)。プロパティ行によるシリアル化は、発生する。しかし、メンテナンスの観点からは、生活をはるかに簡単にします。新しいコストや所得の追加などは、ドロップダウンボックスのオプションです。収入側でも同じですが、これも連鎖財産所得を持つ各プロパティ行の拡張です。また、(総勘定元帳ごとに)一般的な間接費の行があります。したがって、元帳は、4行(所得と費用が連続した4つの不動産ごとに1つずつ)に、特定のプロパティに起因しないコストの一般行を加えたものになります。元帳は、財産グループの収益性分析のための内部的な言葉です。

+0

「$ p」とは何ですか? – Progrock

+0

私はあなたの質問に答えて私の質問を延長しました – jimshot

答えて

0
<?php 
foreach($rows as $row) 
    $out[$row->cost_month] += $row->cost_amount; 
ksort($out); 
foreach($out as $k=>$v) 
    $result[] = [$k, $v]; 
+0

ありがとう。私はこれがどのように機能するのかよく分かりません。コードは私が掲載した手順に関連して配列$行は何ですか? – jimshot

+0

@jimshot、 '$ rows'はコードの先頭のデータベース選択ループを表します。 – Progrock

関連する問題