У меня многомерный массив, и я стараюсь добавить сумму аудитории, если у них одинаковое значение 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
)
)
Ассоциативные массивы - ваш друг.
$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, но вставьте их в "+".
if (!isset...
Наилучший подход заключается не в том, чтобы отменить элементы текущего массива, а скорее записать в новый, слияние с ним по мере продвижения. Изменение структуры массива, когда вы повторяете его, обычно плохое.
Если вы хотите объединить с помощью 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);
Возможно, вам придется уточнить методы слияния в зависимости от точных типов данных, но вы должны получить эту идею.