Kandinski
Kandinski

Reputation: 983

PHP : Avoid duplicates in a foreach loop

Hello I am looping an array like:

Array
(
[01/04/2013 - 14:54] => Array
        (
            [0] => 13528
            [1] => status
            [2] => Waiting
            [3] => 10000
            [4] => Message to user
            [5] => Message3 to my dear user
        )

[01/04/2013 - 14:14] => Array
        (
            [0] => 13523
            [1] => status
            [2] => Waiting
            [3] => 10000
            [4] => Message to user
            [5] => Message2 to my dear user
        )

[12/20/2012 - 09:13] => Array
        (
            [0] => 13476
            [1] => status
            [2] => Waiting
            [3] => 10000
            [4] => Message to user
            [5] => Message do my dear user
       )
);

What I need is to display it properly avoiding duplicates: Here is my code.

foreach ($histories_by_date as $date => $events) {
$output .= $date;
foreach ($events as $key => $event) {
    switch ($events[$key]) {
        case 'Message from user':
            $output .= $events[$key + 1];
            break;
        case 'Message to user':
            $output .= $events[$key + 1];
            break;
       }
    }//foreach2
    }//foreach1

What is annoying is I get duplicates like:

01/04/2013 - 14:54 (CET)
Message3 to my dear user

01/04/2013 - 14:14 (CET)
Message3 to my dear user
Message2 to my dear user

12/20/2012 - 09:13 (CET)
Message3 to my dear user
Message2 to my dear user
Message do my dear user

I only need to display as in original array.

Upvotes: 0

Views: 1666

Answers (1)

axel.michel
axel.michel

Reputation: 5774

Should work like this:

$tmp = '';
$output = '';
foreach ($histories_by_date as $date => $events) {
    $output .= $date;
    foreach ($events as $key => $event) {
      switch ($events[$key]) {
        case 'Message from user':
            $tmp  .= $events[$key + 1];
            break;
        case 'Message to user':
            $tmp .= $events[$key + 1];
            break;
       }
    }//foreach2
    $output.=$tmp;
    $tmp = '';
}//foreach1

Alternative solution would be to break the foreach loop to, not only the switch like this:

$output = "";
foreach ($histories_by_date as $date => $events) {
    $output .= $date;
    foreach ($events as $key => $event) {
        $tmp = '';
        switch ($events[$key]) {
            case 'Message from user':
                $tmp  .= $events[$key + 1];
                break 2;
            case 'Message to user':
                $tmp .= $events[$key + 1];
                break 2;
           }
    }//foreach2

    $output.=$tmp;
}//foreach1
echo $output;

Upvotes: 2

Related Questions