PHP разделить массив на основе результатов поиска - PullRequest
0 голосов
/ 14 мая 2011

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

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

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

  • 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
        )

)

Ответы [ 2 ]

1 голос
/ 14 мая 2011

Если я полностью понимаю, что вы хотите, то этот код должен вас удовлетворить:

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 голосов
/ 14 мая 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...