Aleski
Aleski

Reputation: 1442

Grouping or sorting an array in PHP based on its values for a specific field

SELECT    m.manufacturers_id, m.manufacturers_name,
          op.products_price,
          op.products_quantity,
          p.products_cost.....

I have these fields and I need to perform php arithmetic on the results, but keep them grouped based on their m.manufacturers_id. This is the format of the result I need or desire.

Array(
    [m.manufacturers_id]
        [m.manufacturers_name]
            [brands_total_sales ]
            (sum of all the products_price * qty for the products in this manufacturers_id)
            [products]
                [0] =>
                    [op.products_price] = ''
                    [op.products_quantity] = ''
                    [p.products_cost] = ''
                [1] =>
                    [op.products_price] = ''
                    [op.products_quantity] = ''
                    [p.products_cost] = ''
                [2] =>

Then that repeats for all the products per unique manufacturers_id. I guess basically the question is, is there a php function to manipulate an array of results to "sort" or "group" into manufacturers_id

Thanks in advance, an help or advise is greatly appreciated.

Upvotes: 0

Views: 52

Answers (2)

Latheesan
Latheesan

Reputation: 24116

php script

<pre>
<?php

// Data Source
$db_data = array(
    array('manufacturers_id' => 1, 'manufacturers_name' => 'Some Company', 'products_price' => 1.99, 'products_quantity' => 12, 'products_cost' => 0.49),
    array('manufacturers_id' => 1, 'manufacturers_name' => 'Some Company', 'products_price' => 1.99, 'products_quantity' => 12, 'products_cost' => 0.49),
    array('manufacturers_id' => 2, 'manufacturers_name' => 'Another Company', 'products_price' => 12.99, 'products_quantity' => 112, 'products_cost' => 10.49),
    array('manufacturers_id' => 2, 'manufacturers_name' => 'Another Company', 'products_price' => 12.99, 'products_quantity' => 112, 'products_cost' => 10.49),
);

// Sort Data
$db_data_sorted = array();
foreach ($db_data as $data) {
    $db_data_sorted[$data['manufacturers_id']][$data['manufacturers_name']]['brands_total_sales'] += (intval($data['products_quantity']) * floatval($data['products_price']));
    $db_data_sorted[$data['manufacturers_id']][$data['manufacturers_name']]['products'][] = array(
        'products_price' => $data['products_price'],
        'products_quantity' => $data['products_quantity'],
        'products_cost' => $data['products_cost']
    );
}

// Debug
print_r($db_data_sorted);

?>

output:

Array
(
    [1] => Array
        (
            [Some Company] => Array
                (
                    [brands_total_sales] => 47.76
                    [products] => Array
                        (
                            [0] => Array
                                (
                                    [products_price] => 1.99
                                    [products_quantity] => 12
                                    [products_cost] => 0.49
                                )

                            [1] => Array
                                (
                                    [products_price] => 1.99
                                    [products_quantity] => 12
                                    [products_cost] => 0.49
                                )

                        )

                )

        )

    [2] => Array
        (
            [Another Company] => Array
                (
                    [brands_total_sales] => 2909.76
                    [products] => Array
                        (
                            [0] => Array
                                (
                                    [products_price] => 12.99
                                    [products_quantity] => 112
                                    [products_cost] => 10.49
                                )

                            [1] => Array
                                (
                                    [products_price] => 12.99
                                    [products_quantity] => 112
                                    [products_cost] => 10.49
                                )

                        )

                )

        )

)

Upvotes: 2

JoDev
JoDev

Reputation: 6873

Maybe something like :

$response = array();
while($row = mysql_fetch_array($result))  {
   $response[$row['m.manufacturers_id']][$row['m.manufacturers_name']][$row['op.products_id']] = array(
    $row['op.products_price'],
    $row['op.products_quantity'],
    $row['p.products_cost']);
}

Upvotes: 0

Related Questions