Alphy
Alphy

Reputation: 331

Working with arrays to produce a single array

I have an array that can have many values at any given point, what I would like to accomplish is to combine all the array indexes and form one index with my final value. Merge other values that are the same

Say I have the array result below

Array
(
    [0] => stdClass Object
        (
            [component] => sodium chloride
            [generic_results] => Average:=99.20%
        )

    [1] => stdClass Object
        (
            [component] => sodium chloride
            [generic_results] => RSD:=0.54%
        )

    [2] => stdClass Object
        (
            [component] => sodium chloride
            [generic_results] => n:=3
        )

)

What I would like is something like this

Array
(
    [0] => stdClass Object
        (
            [component] => sodium chloride
            [generic_results] => Average:=99.20%,RSD:=0.54%, n:=3
        )
)

I have tried array unique but its not working.

Example code generating the results:

   $arr=array(
            (object) array(
                'component'=>'sodium chloride',
                 'generic_results'=>'Average:=99'
            ),
            (object) array(
                'component'=>'sodium chloride',
                 'generic_results'=>'RSD:=0.54'
            ),
            (object) array(
                'component'=>'sodium chloride',
                 'generic_results'=>'n:=3'
            )
        );      

        print('<pre>');
        print_r($arr); 
        print('</pre>');

Any Suggestions for this problem?

Upvotes: 1

Views: 45

Answers (2)

Ukuser32
Ukuser32

Reputation: 2189

Try this

$new = array();
foreach ($array as $obj){
    // By setting the key you guarantee it being unique
    $new[$obj->component][$obj->generic_results] = $obj->generic_results;
}

$new2 = array();
foreach ($new as $comp=>$arr){
    $new2['component'][$comp] = implode(',',$arr);
}

This will return an array but you can (although its not always sufficient) then use json_decode(json_encode($new2), false) to convert it to the object. Hope that helps.

Upvotes: 2

Fabian Schmengler
Fabian Schmengler

Reputation: 24576

You can use array_reduce, which iterates over an array to combine all elements with a given callback function:

$result = array_reduce($arr, function($result, $item) {
    if ($result === null) {

        // initialize with first item
        return [$item];
    }

    // add generic_results of current item to result
    $result[0]->generic_results .= ',' . $item->generic_results;
    return $result;
    }
);

Demo: https://3v4l.org/KBUBl

Upvotes: 1

Related Questions