0

I'm a beginner at php and was searching for a solution all day long without success.

I have the following array:

$data = Array
(
[0] => Array
    (
        [my_id] => 1
        [my_post_id] => 123
        [my_status] => 1
        [my_rating] => 5
    )

[1] => Array
    (
        [my_id] => 2
        [my_post_id] => 123
        [my_status] => 1
        [my_rating] => 4
    )

[2] => Array
    (
        [my_id] => 3
        [my_post_id] => 123
        [my_status] => 1
        [my_rating] => 5
    )

[3] => Array
    (
        [my_id] => 4
        [my_post_id] => 456
        [my_status] => 1
        [my_rating] => 5
    )

[4] => Array
    (
        [my_id] => 5
        [my_post_id] => 456
        [my_status] => 1
        [my_rating] => 3
    )
)

and would like to merge the arrays with the same 'my_post_id' and count the values for 'my_status' and 'my_rating' which have the same 'my_post_id'.

At the end, I would like to have the following array:

 $data = Array
(
[0] => Array
    (
        [my_post_id] => 123
        [my_status] => 3
        [my_rating] => 14
    )

[1] => Array
    (
        [my_post_id] => 456
        [my_status] => 2
        [my_rating] => 8
    )
)

I could get arrays with unique 'my_post_id' with the following code but I couldn't find out how to count the other values.

$out = array();
    foreach( $data as $row ) {
        $out[$row['my_post_id']] = $row;
    }
    $array = array_values( $out );

Any help would be much appreciated.

Daniel

3
  • I'm sure you could do something with if (isset($out[$row['my_post_id']])) { ... } Commented Oct 1, 2012 at 16:21
  • Still don't understand how your merge works... Commented Oct 1, 2012 at 16:23
  • take a look at MiDo and my posts below. Both show you methods to increment(sum) the values. the only real difference is his pushes the post_id up as the key field, whereas mine increments a non-related like you asked for. I think if you reconsider your requirement, his makes more sense for your end result. Commented Oct 1, 2012 at 16:45

2 Answers 2

1

This will produce the array you are looking for:

$out = array();
foreach( $data as $row ) {
    if (!isset($out[$row['my_post_id']])) {
        $out[$row['my_post_id']] = Array( "my_id"=>$row['my_id'],
                                          "my_status" => $row["my_status"],
                                          "my_rating" => $row["my_rating"]);
    }
    else {
        $out[$row['my_post_id']]["my_status"] += $row["my_status"];
        $out[$row['my_post_id']]["my_rating"] += $row["my_rating"];
    }

}

results in:

Array
(
    [123] => Array
        (
            [my_id] => 1
            [my_status] => 3
            [my_rating] => 14
        )

    [456] => Array
        (
            [my_id] => 4
            [my_status] => 2
            [my_rating] => 8
        )

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

1 Comment

Wow, that was fast :-) Thanks a lot for your help. It's much appreciated and it worked perfectly.
1

try the following - untested code

foreach($data as $key => $val){
    if(!array_search($val['my_post_id'],$newArray)){
        $newArray[]=array('my_post_id' => $val['my_post_id'], 
                          'my_status' => $val['my_status'],
                          'my_rating' => $val['my_rating']);
    }else{
        $myIndex=array_search($val['my_post_id'],$newArray);
        $newArray[$myIndex]['my_status']+=$val['my_status'];
        $newArray[$myIndex]['my_rating']+=$val['my_rating'];
    }
}

Comments

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.