1

If view is less than one I would like to output to remain as it is but if view > 0 I would like to add all the values that share the same date and output it like:-

Array
(
    [0] => Array
        (
            [date] => 09-04-2018
            [value] => 30
        )

    [1] => Array
        (
            [date] => 10-04-2018
            [value] => 32
        )

    [2] => Array
        (
            [date] => 11-04-2018
            [value] => 34
        )

    [3] => Array
        (
            [date] => 12-04-2018
            [value] => 36
        )

    [4] => Array
        (
            [date] => 13-04-2018
            [value] => 39
        )
)

I am using the following code which works for view = 0 but does not add the correct values when view = 1:-

$view = 1;

$a = array(
        array('name' => 'Days','date' => '09-04-2018','value' => '10'),
        array('name' => 'Nights','date' => '09-04-2018','value' => '20'),
        array('name' => 'Days','date' => '10-04-2018','value' => '11'),
        array('name' => 'Nights','date' => '10-04-2018','value' => '21'),
        array('name' => 'Days','date' => '11-04-2018','value' => '12'),
        array('name' => 'Nights','date' => '11-04-2018','value' => '22'),
        array('name' => 'Days','date' => '12-04-2018','value' => '13'),
        array('name' => 'Nights','date' => '12-04-2018','value' => '23'),
        array('name' => 'Days','date' => '13-04-2018','value' => '14'),
        array('name' => 'Days','date' => '13-04-2018','value' => '24'),
        array('name' => 'Days','date' => '13-04-2018','value' => '1')
    );

$i = 0;
foreach ($a as $b)
{
    $date = $b['date'];
    $value = $b['value'];

    $key = $i;

    if ($view > 0)
    {
        if ( $key = array_search($date, array_column($c, 'date')) > 0 )
        {
            $value = $c[$key]['value'] + $value;
        }
        else 
        {
            $key = $i;
        }
    }

    $c[$key]['name'] = 'Combined';
    $c[$key]['date'] = $date;
    $c[$key]['value'] = $value;

    $i++;
}

echo "<pre>";
print_r($c);
echo "</pre>";

can anyone tell me where I am going wrong?

8
  • Where does the variable $c come from and what does it contain? Commented Apr 18, 2018 at 19:50
  • @MagnusEriksson it's the output later on, but doesn't seem to be initialized before..? Commented Apr 18, 2018 at 19:51
  • yes it is another array created to output the results Commented Apr 18, 2018 at 19:52
  • If you want us to understand your code, you need to show us all relevant code (like where you define $c). Commented Apr 18, 2018 at 19:53
  • that line if ( $key = array_search($date, array_column($c, 'date')) > 0 ) seems to me to be the problem. it does make $key true or false, right? Commented Apr 18, 2018 at 19:53

1 Answer 1

2

The problem is that you use $key = $i in the case of $view > 0, but, $i could be greater than the current size of $c. Then, the comparison with the value of array_keys must be a strict comparison the check if the key if different or greater that 0, or false (not found). finally, you need to create an empty array $c to start to avoid a warning in array_column.

$view = 1;
$a = array(
        array('name' => 'Days','date' => '09-04-2018','value' => '10'),
        array('name' => 'Nights','date' => '09-04-2018','value' => '20'),
        array('name' => 'Days','date' => '10-04-2018','value' => '11'),
        array('name' => 'Nights','date' => '10-04-2018','value' => '21'),
        array('name' => 'Days','date' => '11-04-2018','value' => '12'),
        array('name' => 'Nights','date' => '11-04-2018','value' => '22'),
        array('name' => 'Days','date' => '12-04-2018','value' => '13'),
        array('name' => 'Nights','date' => '12-04-2018','value' => '23'),
        array('name' => 'Days','date' => '13-04-2018','value' => '14'),
        array('name' => 'Days','date' => '13-04-2018','value' => '24'),
        array('name' => 'Days','date' => '13-04-2018','value' => '1')
    );

$c =[];
foreach ($a as $i => $b)
{
    $date = $b['date'];
    $value = $b['value'];

    $key = $i;

    if ($view > 0)
    {
        $key = array_search($date, array_column($c, 'date'));
        if ($key !== false)
        {
            $value = $c[$key]['value'] + $value;
        }
        else
        {
            $key = count($c); // Create a new index here instead of $i
        }
    }
    else
    {
        $key = $i;
    }

    $c[$key]['name'] = 'Combined';
    $c[$key]['date'] = $date;
    $c[$key]['value'] = $value;
}

print_r($c);

outputs:

Array
(
    [0] => Array
        (
            [name] => Combined
            [date] => 09-04-2018
            [value] => 30
        )

    [1] => Array
        (
            [name] => Combined
            [date] => 10-04-2018
            [value] => 32
        )

    [2] => Array
        (
            [name] => Combined
            [date] => 11-04-2018
            [value] => 34
        )

    [3] => Array
        (
            [name] => Combined
            [date] => 12-04-2018
            [value] => 36
        )

    [4] => Array
        (
            [name] => Combined
            [date] => 13-04-2018
            [value] => 39
        )

)
Sign up to request clarification or add additional context in comments.

1 Comment

Thanks for the great answer, solved my problem and explained your answer.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.