Home > Net >  PHP multi-dimensional array merge same date and do multiple condition
PHP multi-dimensional array merge same date and do multiple condition

Time:10-12

I created an array like this

    Array
(
    [0] => Array
        (
            [amount] => 13.31000000
            [i] => 1
            [created_at] => 2022-10-10 23:21:47
        )

    [1] => Array
        (
            [amount] => 19.00000000
            [i] => 2
            [created_at] => 2022-10-10 23:21:38
        )

    [2] => Array
        (
            [amount] => 17.32000000
            [i] => 2
            [created_at] => 2022-10-09 23:21:47
        )

    [3] => Array
        (
            [amount] => 19.15000000
            [i] => 2
            [created_at] => 2022-10-08 23:21:47
        )

    [4] => Array
        (
            [amount] => 14.68000000
            [i] => 2
            [created_at] => 2022-10-07 23:21:47
        )

    [5] => Array
        (
            [amount] => 18.31000000
            [i] => 2
            [created_at] => 2022-10-06 23:21:47
        )

    [6] => Array
        (
            [amount] => 19.48000000
            [i] => 2
            [created_at] => 2022-10-05 23:21:47
        )

    [7] => Array
        (
            [amount] => 11.20000000
            [i] => 1
            [created_at] => 2022-10-04 23:21:47
        )

    [8] => Array
        (
            [amount] => 12.91000000
            [i] => 2
            [created_at] => 2022-10-03 23:21:47
        )

    [9] => Array
        (
            [amount] => 11.55000000
            [i] => 2
            [created_at] => 2022-10-02 23:21:47
        )

    [10] => Array
        (
            [amount] => 13.64000000
            [i] => 1
            [created_at] => 2022-10-09 23:21:38
        )

    [11] => Array
        (
            [amount] => 18.44000000
            [i] => 1
            [created_at] => 2022-10-08 23:21:38
        )

    [12] => Array
        (
            [amount] => 11.56000000
            [i] => 2
            [created_at] => 2022-10-07 23:21:38
        )

    [13] => Array
        (
            [amount] => 12.13000000
            [i] => 1
            [created_at] => 2022-10-06 23:21:38
        )

    [14] => Array
        (
            [amount] => 13.39000000
            [i] => 1
            [created_at] => 2022-10-05 23:21:38
        )

    [15] => Array
        (
            [amount] => 11.36000000
            [i] => 2
            [created_at] => 2022-10-04 23:21:38
        )

    [16] => Array
        (
            [amount] => 11.82000000
            [i] => 1
            [created_at] => 2022-10-03 23:21:38
        )

    [17] => Array
        (
            [amount] => 14.03000000
            [i] => 1
            [created_at] => 2022-10-02 23:21:38
        )

)

I want to merge same date and do the increase or decrease based on [i] value

I already created this foreach

foreach ($result as $k => $y) {
  $info = "decrease";
  if($y['i']==1){
    $info = "increase";
  }
  $d = date('mdy', strtotime($y['created_at']));
  $newDates[$d] = $d;
  if(isset($res[$d]["increase"])){
    $res[$d]["increase"]  = $y['amount'];
  }else{
    $res[$d]["increase"] = 0;
  }
  if(isset($res[$d]["decrease"])){
    $res[$d]["decrease"]  = $y['amount'];
  }else{
    $res[$d]["decrease"] = 0;
  }
}

What I get for the result is like this

Array
(
    [101022] => Array
        (
            [increase] => 19
            [decrease] => 19
        )

    [100922] => Array
        (
            [increase] => 13.64
            [decrease] => 13.64
        )

    [100822] => Array
        (
            [increase] => 18.44
            [decrease] => 18.44
        )

    [100722] => Array
        (
            [increase] => 11.56
            [decrease] => 11.56
        )

    [100622] => Array
        (
            [increase] => 12.13
            [decrease] => 12.13
        )

    [100522] => Array
        (
            [increase] => 13.39
            [decrease] => 13.39
        )

    [100422] => Array
        (
            [increase] => 11.36
            [decrease] => 11.36
        )

    [100322] => Array
        (
            [increase] => 11.82
            [decrease] => 11.82
        )

    [100222] => Array
        (
            [increase] => 14.03
            [decrease] => 14.03
        )

)

But it should be like this for the result

Array ( [101022] => Array ( [increase] => 13.31 [decrease] => 19 )

    [100922] => Array
        (
            [increase] => 13.64
            [decrease] => 17.32
        )

    [100822] => Array
        (
            [increase] => 18.44
            [decrease] => 19.15
        )

    [100722] => Array
        (
            [increase] => 0
            [decrease] => 26.24
        )

    [100622] => Array
        (
            [increase] => 12.13
            [decrease] => 18.31
        )

    [100522] => Array
        (
            [increase] => 13.39
            [decrease] => 19.48
        )

    [100422] => Array
        (
            [increase] => 11.20
            [decrease] => 11.36
        )

    [100322] => Array
        (
            [increase] => 11.82
            [decrease] => 12.91
        )

    [100222] => Array
        (
            [increase] => 14.03
            [decrease] => 11.55
        )

)

For the data in date 100722 the increase should be 0 because the data give all decrease [i] = 1 // increase [i] = 2 // decrease

thanks for helping me

CodePudding user response:

When creating the array, you could set the values to zero. This also ensures the increase and decrease key stay in order.

$array = [
    ['amount' => 13.31000000, 'i' => 1, 'created_at' => '2022-10-10 23:21:47',],
    ['amount' => 19.00000000, 'i' => 2, 'created_at' => '2022-10-10 23:21:38',],
    ['amount' => 17.32000000, 'i' => 2, 'created_at' => '2022-10-09 23:21:47',],
    ['amount' => 19.15000000, 'i' => 2, 'created_at' => '2022-10-08 23:21:47',],
    ['amount' => 14.68000000, 'i' => 2, 'created_at' => '2022-10-07 23:21:47',],
    ['amount' => 18.31000000, 'i' => 2, 'created_at' => '2022-10-06 23:21:47',],
    ['amount' => 19.48000000, 'i' => 2, 'created_at' => '2022-10-05 23:21:47',],
    ['amount' => 11.20000000, 'i' => 1, 'created_at' => '2022-10-04 23:21:47',],
    ['amount' => 12.91000000, 'i' => 2, 'created_at' => '2022-10-03 23:21:47',],
    ['amount' => 11.55000000, 'i' => 2, 'created_at' => '2022-10-02 23:21:47',],
    ['amount' => 13.64000000, 'i' => 1, 'created_at' => '2022-10-09 23:21:38',],
    ['amount' => 18.44000000, 'i' => 1, 'created_at' => '2022-10-08 23:21:38',],
    ['amount' => 11.56000000, 'i' => 2, 'created_at' => '2022-10-07 23:21:38',],
    ['amount' => 12.13000000, 'i' => 1, 'created_at' => '2022-10-06 23:21:38',],
    ['amount' => 13.39000000, 'i' => 1, 'created_at' => '2022-10-05 23:21:38',],
    ['amount' => 11.36000000, 'i' => 2, 'created_at' => '2022-10-04 23:21:38',],
    ['amount' => 11.82000000, 'i' => 1, 'created_at' => '2022-10-03 23:21:38',],
    ['amount' => 14.03000000, 'i' => 1, 'created_at' => '2022-10-02 23:21:38',],
];

$result = [];
foreach ($array as $item) {
    $key     = date('mdy', strtotime($item['created_at']));
    $operand = $item['i'] === 1 ? 'increase' : 'decrease';
    if (!isset($result[$key])) $result[$key] = ['increase' => 0, 'decrease' => 0,];
    $result[$key][$operand]  = $item['amount'];
}

print_r($result);

Output

Array
(
    [101022] => Array
        (
            [increase] => 13.31
            [decrease] => 19
        )

    [100922] => Array
        (
            [increase] => 13.64
            [decrease] => 17.32
        )

    [100822] => Array
        (
            [increase] => 18.44
            [decrease] => 19.15
        )

    [100722] => Array
        (
            [increase] => 0
            [decrease] => 26.24
        )

    [100622] => Array
        (
            [increase] => 12.13
            [decrease] => 18.31
        )

    [100522] => Array
        (
            [increase] => 13.39
            [decrease] => 19.48
        )

    [100422] => Array
        (
            [increase] => 11.2
            [decrease] => 11.36
        )

    [100322] => Array
        (
            [increase] => 11.82
            [decrease] => 12.91
        )

    [100222] => Array
        (
            [increase] => 14.03
            [decrease] => 11.55
        )

)
  • Related