2011-05-14 19 views
0

У меня есть многомерный массив, который создается MySQL-запросом, который собирает результаты на основе нескольких групп и сумм. Массив ниже.Растровый массив PHP на основе результатов поиска

Меня интересует рентабельность и количество посещений для каждого типа вариантов «ad_type», «click_status» и «link_status».

Возможные значения 3 типа переменной известны: т.е.

  • ad_type 0/1
  • click_status 2/3
  • link_status 1/2

Я например, создать новый массив на основе результатов каждой комбинации.

Я предполагаю, что поиск или раскол сделают это, но мне не повезло.

Как бы я это сделал?

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 Зная недостатки:

  • Нет ООП (но эти функции будут легко преобразовать к методам)
  • Магического числа (0, 1, 2, 3 и т.д.)
+0

Это было намного больше, чем я ожидал. после небольшого поцарапания головы я понял, что вы сделали, и это здорово. Огромное спасибо. – Damo

0

Нет массив расщепляющего необходимо. Просто создайте переменные, которые будут хранить итоговые значения для каждой из перестановок, которые вы хотите измерить, и выполните итерацию по вашему массиву. Добавьте в соответствующие переменные на основе значения, которое вы наблюдаете в ad_type, click_status и link_status.

Смежные вопросы