Unset массив в многомерном массиве php

0

У меня многомерный массив, и я стараюсь добавить сумму аудитории, если у них одинаковое значение split_id, но другое post_page_id и возвращает массив с общим значением каждого деления и отключает остальные. Я пробовал двойной foreach, но это не сработало. Любая помощь? благодаря

Array
(
    [0] => Array
        (
            [id] => 1
            [post_page_id] => 22130
            [audience] => 276
            [type] => facebook
            [division_id] => 1
            [tw_audience] => 
        )

    [1] => Array
        (
            [id] => 14
            [post_page_id] => 22465
            [audience] => 6
            [type] => facebook
            [division_id] => 1
            [tw_audience] => 
        )

    [2] => Array
        (
            [id] => 2
            [post_page_id] => 22189
            [audience] => 175
            [type] => twitter
            [division_id] => 2
            [tw_audience] => 
         )
    [3] => Array
        (
            [id] => 1
            [post_page_id] => 23044
            [audience] => 180
            [type] => facebook
            [division_id] => 2
            [tw_audience] => 
        )
)

Поэтому я хочу, чтобы результат был таким

Array
(
    [0] => Array
        (
            [id] => 1
            [post_page_id] => 22130, 22465
            [audience] => 282
            [type] => facebook
            [division_id] => 1
            [tw_audience] => 
        )

    [1] => Array
        (
            [id] => 2
            [post_page_id] => 22189, 23044
            [audience] => 180
            [type] => twitter+facebook
            [division_id] => 2
            [tw_audience] => 175
         )

)
  • 0
    Можете ли вы привести пример того, как вы хотите, чтобы результат выглядел, учитывая данные здесь?
  • 0
    только что отредактированный, в основном, я хотел бы объединить массивы и подвести итоги аудитории и отменить объединение. Спасибо
Теги:
multidimensional-array
foreach

2 ответа

0
Лучший ответ

Ассоциативные массивы - ваш друг.

$result = array ();
foreach ($input as $inp)
{
    $idx = $inp ['division_id'];
    if  (isset ($result [$idx]))  //  New result, just copy it across
    {
        $result [$idx] = $inp;
        //  Since we are going to have multiple pages, turn the page_id into an array
        $result [$idx]['post_page_id'] = array ($inp ['post_page_id']);
    }
    else  //  Already exists - add the totals to the existing one
    {
        $result [$idx]['audience'] += $inp ['audience'];
        $result [$idx]['post_page_id'][] = $inp ['post_page_id'];
    }
}
//  Now, I assume you want to get rid of duplicates
foreach ($result as &$r)
{
    //  &$r means you are working with a pointer to the original, not a copy
    //  so changes are applied back to the original
    $r ['post_page_id'] = array_unique [$r ['post_page_id']];
    //  and if you really want the pages in comma-delimited format...
    $r ['post_page_id'] = implode (', ', $r ['post_page_id']);
}

Возможно, вы захотите сделать то же самое с источниками, что и для post_page_id, но вставьте их в "+".

  • 1
    Щелчок! Хотя ваша пятая строка, вероятно, должна быть, if (!isset...
  • 0
    Спасибо вам два, это прекрасно работает.
Показать ещё 1 комментарий
0

Наилучший подход заключается не в том, чтобы отменить элементы текущего массива, а скорее записать в новый, слияние с ним по мере продвижения. Изменение структуры массива, когда вы повторяете его, обычно плохое.

Если вы хотите объединить с помощью division_id, вы можете записать в новый массив, используя это значение в качестве ключа массива. Затем просто проверьте, существует ли он - если это не так, скопируйте там строку, если это так, объедините значения, которые вы хотите объединить.

Предполагая, что ваш исходный массив находится в переменной $originalArray:

$newArray = array();
foreach ($originalArray as $row) {
    $divID = $row['division_id'];
    // Check if this division_id has occurred before
    if (!isset($newArray[$divID])) {
        // Add in the first row if not
        $newArray[$divID] = $row;
    } else {
        // Otherwise, merge it into existing row

        // Merge audience
        $newArray[$divID]['audience'] += $row['audience'];

        // Merge post IDs
        $newArray[$divID]['post_page_id'] .= ', ' . $row['post_page_id'];

        // Merge type - need to account for duplicates
        $typeVals = explode('+', $newArray[$divID]['type']);
        if (!in_array($row['type'], $typeVals)) {
            $newArray[$divID]['type'] .= '+' . $row['type'];
        }
    }

}

// Overwrite original array, and use array_values() to reset keys if needed
$originalArray = array_values($newArray);
unset($newArray, $typeVals);

Возможно, вам придется уточнить методы слияния в зависимости от точных типов данных, но вы должны получить эту идею.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню