如何在PHP中减去多维数组中的所有列值?

时间:2018-10-05 11:03:56

标签: php

如何减去所有列的值?我的数组就像

Array
(
    [0] => Array
        (
            [id] => 1
            [web_traffic] => 442
            [form_users] => 131
            [date] => 20181004
        )

    [1] => Array
        (
            [id] => 2
            [web_traffic] => 102
            [form_users] => 15
            [date] => 20181003
        )
    [2] => Array
        (
            [id] => 3
            [web_traffic] => 387
            [form_users] => 97
            [date] => 20181002
        )
)

我需要减去每一列(日期和ID除外),并根据日期(升序)获得结果。例如,20181004表示2018年10月4日。我的输出应如下所示

Array
(
    [web_traffic] => -152
    [form_users] => -49
)

我的代码来自How to sum all column values in multi-dimensional array?

foreach ($data as $value) {
        unset($value[ 'id' ]);
        $time = date('Ymd', strtotime($value[ 'date' ]));
        if (in_array($time, $dates)) {
            $value[ 'date' ] = $time;
            foreach ($value as $key => $secondValue) {
                if ( !isset($output[ $key ])) {
                    $output[ $key ] = 0;
                }
                $output[ $key ] -= $secondValue;
            }
        }
    }

2 个答案:

答案 0 :(得分:2)

像这样使用PHP array_reduce()array_column()

$initial_array = array(array('id'           => 1,
                     'web_traffic'  => 442,
                     'form_users'   => 131,
                     'date'         => 20181004),
               array('id'           => 2,
                     'web_traffic'  => 102,
                     'form_users'   => 15,
                     'date'         => 20181003),
               array('id'           => 3,
                     'web_traffic'  => 387,
                     'form_users'   => 97,
                     'date'         => 20181002));

function sum($carry, $item)
    {
        $carry -= $item;
        return $carry;
    }

$web_traffic  = array_column($initial_array, "web_traffic");
$form_users = array_column($initial_array, "form_users");
$date = array_column($initial_array, "date");


array_multisort($date, SORT_ASC, $form_users, SORT_DESC,  $initial_array);


$result_array = Array(
            "web_traffic" => array_reduce(array_column($initial_array, "web_traffic"), "sum",2*$initial_array[0]['web_traffic']),
            "form_users" => array_reduce(array_column($initial_array, "form_users"), "sum",2*$initial_array[0]['form_users'])
        );

print_r($result_array);

答案 1 :(得分:0)

在示例中,我将首先使用usort()对数组进行排序。

先排序,因为将1的旧数据循环到较新的数据会很困难。

分开的意图提供了更简洁的代码,更易于维护。

日期不需要转换为date。该字符串格式正确,可以在比较和排序中按原样使用。 "20170101" < "20180101""20180101" < "20181001""20181002" < "20181004"

完成后,我将把第一个值保存为用于减法的初始值。

然后,循环排序数组,并将'web_traffic''form_users'减去为初始值。

$datas = array(array('id'           => 1,
                     'web_traffic'  => 442,
                     'form_users'   => 131,
                     'date'         => 20181004),
               array('id'           => 2,
                     'web_traffic'  => 102,
                     'form_users'   => 15,
                     'date'         => 20181003),
               array('id'           => 3,
                     'web_traffic'  => 387,
                     'form_users'   => 97,
                     'date'         => 20181002));

//If needed, you can backup the original array, because usort() will modify it.
$backUpDatas = $datas;

//Sort
usort($datas, function ($arr1, $arr2)
{
    if (isset($arr1['date']) && isset($arr2['date']))
    {
        if ($arr1['date'] == $arr2['date'])
            return (0);
        return (($arr1['id'] > $arr2['id']) ? (-1) : (1));
    }
});

//Initial values
$finalValues['web_traffic'] = $datas[0]['web_traffic'];
$finalValues['form_users'] = $datas[0]['form_users'];

//Substract
foreach ($datas as $key => $value)
{
    if ($key > 0)
    {
        if (isset($value['web_traffic']))
            $finalValues['web_traffic'] -= $value['web_traffic'];
        if (isset($value['form_users']))
            $finalValues['form_users'] -= $value['form_users'];
    }
}

var_dump($finalValues);

输出:

array (size=2)
  'web_traffic' => int -157
  'form_users' => int -49