2011-05-14 20 views
0

私は多次元配列を持っています。多次元配列は、いくつかのグループと合計に基づいて結果を収集するMySQLクエリによって作成されます。配列は以下の通りです。検索結果に基づくPHP分割配列

「ad_type」、「click_status」、「link_status」の各タイプのcosttotalとhitcountに興味があります。

変数の3種類の可能な値が知られている:

    • すなわちAD_TYPE 0/1
    • click_status 2月3日
    • link_status/2

    Iはなりますそれぞれの組み合わせの結果に基づいて新しい配列を作成するのが好きです。

    私は検索や分割がそれをすると思っていますが、私は大したことはありません。

    どうすればいいですか?

    Array 
    (
        [0.261346210037681] => Array 
         (
          [costtotal] => 0.0015 
          [hitcount] => 1 
          [ad_type] => 0 
          [click_status] => 2 
          [link_status] => 1 
         ) 
    
        [0.190427019438173] => Array 
         (
          [costtotal] => 0.001 
          [hitcount] => 1 
          [ad_type] => 0 
          [click_status] => 3 
          [link_status] => 1 
         ) 
    
        [0.563596305962276] => Array 
         (
          [costtotal] => 0.007 
          [hitcount] => 5 
          [ad_type] => 1 
          [click_status] => 2 
          [link_status] => 1 
         ) 
    
        [0.893211513658251] => Array 
         (
          [costtotal] => 0 
          [hitcount] => 3 
          [ad_type] => 1 
          [click_status] => 2 
          [link_status] => 2 
         ) 
    
        [0.209184847035617] => Array 
         (
          [costtotal] => 0.004 
          [hitcount] => 2 
          [ad_type] => 1 
          [click_status] => 3 
          [link_status] => 1 
         ) 
    
        [0.73545002260753] => Array 
         (
          [costtotal] => 0 
          [hitcount] => 1 
          [ad_type] => 1 
          [click_status] => 3 
          [link_status] => 2 
         ) 
    
    ) 
    
  • 答えて

    1

    私は完全にあなたが望むものを理解していれば、このコードはあなたを満たす必要があります。

    function generateClickCounterInfo() { 
        return array(
         'costTotal' => 0.0, 
         'hitCount' => 0 
        ); 
    } 
    
    function generateLinkStatusStructure() { 
        return array(
         1 => generateClickCounterInfo(), 
         2 => generateClickCounterInfo() 
        ); 
    } 
    
    function generateClickStatusStructure() { 
        return array(
         2 => generateLinkStatusStructure(), 
         3 => generateLinkStatusStructure() 
        ); 
    } 
    
    function generateAdTypeArrayStructure() { 
        return array(
         0 => generateClickStatusStructure(), 
         1 => generateClickStatusStructure() 
        ); 
    } 
    
    function getClickCounterReport(array $data) { 
        $result = generateAdTypeArrayStructure(); 
    
        foreach ($data as $key => $value) { 
         $adType  = $value['ad_type']; 
         $clickStatus = $value['click_status']; 
         $linkStatus = $value['link_status']; 
    
    
         if (!isset($result[$adType]) 
          || !isset($result[$adType][$clickStatus]) 
          || !isset($result[$adType][$clickStatus][$linkStatus])) { 
          throw new Exception(
           "Input data does not conform to expected format. " . 
           "ad_type = {$adType}, click_status = {$clickStatus}, link_status = ${linkStatus}" 
          ); 
         } 
    
         $costTotal = $value['costtotal']; 
         $hitCount = $value['hitcount']; 
    
         $result[$adType][$clickStatus][$linkStatus]['costTotal'] += $costTotal; 
         $result[$adType][$clickStatus][$linkStatus]['hitCount'] += $hitCount; 
        } 
    
        return $result; 
    } 
    

    そしてgetClickCounterReport($data)よりは($dataがあなたによって提供されたデータである場合)、以下の配列を生成します:http://pastebin.ubuntu.com/607464/

    PS欠点を知る:

    • いいえOOP(しかし、これらの機能は、メソッドに変換することは容易であろう)
    • 魔術番号(0、1、2、3など)
    +0

    私が期待していた以上に多くのことがありました。ちょっと頭が傷ついた後、あなたがやったことと偉大なことを理解しました。どうもありがとう。 – Damo

    0

    なしアレイ分割は不要です。測定する各順列の合計を格納する変数を作成し、配列全体を反復するだけです。 ad_type、click_status、およびlink_statusで確認した値に基づいて適切な変数に追加します。

    関連する問題