Max Rose-Collins
Max Rose-Collins

Reputation: 1924

Changing the way SQL results are nested in a PHP Array?

The PHP & SQL

            list( $since, $start_index, $count ) = func_get_args();
            $query =    "SELECT 
                            size_groups.id, size_groups.name, GROUP_CONCAT( size_values.names SEPARATOR ';' ) AS `display_name`, GROUP_CONCAT( size_values.vals SEPARATOR ';' ) AS `values`, GROUP_CONCAT( size_count.count SEPARATOR ';' ) AS `count`
                        FROM size_groups
                        LEFT JOIN
                            (SELECT CONCAT_WS( ', ', sizes.size ) AS names, CONCAT_WS( ', ', sizes.id ) AS vals, sizes.id AS ids, sizes.group_id FROM sizes)
                            AS size_values ON size_values.group_id = size_groups.id
                        LEFT JOIN
                            (SELECT CONCAT_WS( ', ', COUNT( product_to_sizes.size_id ) ) AS count, product_to_sizes.size_id FROM product_to_sizes)
                            AS size_count ON size_count.size_id = size_values.ids
                        WHERE size_groups.timestamp >= '%s' AND id = %s
                        GROUP BY size_groups.id
                        ORDER BY size_groups.timestamp ASC LIMIT %s, %s";

            return $this->result( $this->connection->query( $query, $since, $category_id, $start_index, $count ) );

And

   public function result( $data ) {

        $result = array();
        while ($row = $data->fetch_assoc())
            array_push( $result, $row ); 

        return $result;

    }

outputs an array like this

 Array
 (
    [0] => Array
        (
            [id] => 21
            [name] => Sleeve length
            [display_name] => 33;34;35;36;37;38
            [values] => 94;95;96;97;98;99
            [count] => 
        )

    [1] => Array
        (
            [id] => 22
            [name] => Waist
            [display_name] => 40;30;32;34;36;38
            [values] => 105;100;101;102;103;104
            [count] => 
        )
 )

but I want it to be like this

Array
(
    [0] => Array
        (
            [id] => 21
            [name] => Sleeve length
            [values] => Array(
                  Array(
                          [display_name] => 33
                          [value] => 94
                          [count] => 5
                       ),
                  Array(
                          [display_name] => 34
                          [value] => 95
                          [count] => 31
                       )
               )
        ),
        [1] => Array
             (
               etc
             )
)

Table structure for sizes

+-----+--------+----------+----------+---------------------+
| id  | size   | alt_size | group_id | timestamp           |
+-----+--------+----------+----------+---------------------+
|  81 | Small  |          |       19 | 2011-07-15 17:26:01 |
|  82 | Medium |          |       19 | 2011-07-15 17:26:10 |
|  83 | Large  |          |       19 | 2011-07-15 17:26:14 |
|  84 | 14.5   |          |       20 | 2011-07-15 17:28:01 |
|  85 | 15     |          |       20 | 2011-07-15 17:28:05 |
|  86 | 15.5   |          |       20 | 2011-07-15 17:28:08 |
|  87 | 16     |          |       20 | 2011-07-15 17:28:13 |
|  88 | 16.5   |          |       20 | 2011-07-15 17:28:18 |
|  89 | 17     |          |       20 | 2011-07-15 17:28:21 |
|  90 | 17.5   |          |       20 | 2011-07-15 17:28:24 |
|  91 | 18     |          |       20 | 2011-07-15 17:28:27 |
|  92 | 19     |          |       20 | 2011-07-15 17:28:32 |
|  93 | 20     |          |       20 | 2011-07-15 17:28:36 |
|  94 | 33     |          |       21 | 2011-07-15 17:28:49 |
|  95 | 34     |          |       21 | 2011-07-15 17:28:54 |
|  96 | 35     |          |       21 | 2011-07-15 17:28:56 |
|  97 | 36     |          |       21 | 2011-07-15 17:29:00 |
|  98 | 37     |          |       21 | 2011-07-15 17:29:05 |
|  99 | 38     |          |       21 | 2011-07-15 17:29:15 |
| 100 | 30     |          |       22 | 2011-07-15 17:29:42 |
| 101 | 32     |          |       22 | 2011-07-15 17:29:46 |
| 102 | 34     |          |       22 | 2011-07-15 17:29:51 |
| 103 | 36     |          |       22 | 2011-07-15 17:30:03 |
| 104 | 38     |          |       22 | 2011-07-15 17:30:06 |
| 105 | 40     |          |       22 | 2011-07-15 17:30:10 |
| 106 | 32     |          |       23 | 2011-07-15 17:30:52 |
| 107 | 34     |          |       23 | 2011-07-15 17:30:56 |
| 108 | 36     |          |       23 | 2011-07-15 17:31:00 |
| 109 | 38     |          |       23 | 2011-07-15 17:31:04 |
+-----+--------+----------+----------+---------------------+

For size_groups

+----+---------------+---------------------+
| id | name          | timestamp           |
+----+---------------+---------------------+
| 19 | Size          | 2011-07-15 17:25:45 |
| 20 | Collar size   | 2011-07-15 17:26:50 |
| 21 | Sleeve length | 2011-07-15 17:27:00 |
| 22 | Waist         | 2011-07-15 17:27:28 |
| 23 | Leg           | 2011-07-15 17:27:38 |
+----+---------------+---------------------+

And products_to_sizes

+------+------------+---------+-------------+----------+---------------------+
| id   | product_id | size_id | stock_level | theorder | timestamp           |
+------+------------+---------+-------------+----------+---------------------+
| 8050 |        683 |     109 |           0 |        0 | 2011-07-16 10:45:30 |
| 8049 |        683 |     108 |           0 |        0 | 2011-07-16 10:45:30 |
| 8048 |        683 |     107 |           0 |        0 | 2011-07-16 10:45:30 |
| 8099 |        679 |     109 |           0 |        0 | 2011-07-16 10:48:30 |
| 8098 |        679 |     108 |           0 |        0 | 2011-07-16 10:48:30 |
| 8097 |        679 |     107 |           0 |        0 | 2011-07-16 10:48:30 |
| 8096 |        679 |     106 |           0 |        0 | 2011-07-16 10:48:30 |
| 8095 |        679 |     105 |           0 |        0 | 2011-07-16 10:48:30 |
| 8094 |        679 |     104 |           0 |        0 | 2011-07-16 10:48:30 |
| 8093 |        679 |     103 |           0 |        0 | 2011-07-16 10:48:30 |
+------+------------+---------+-------------+----------+---------------------+

Any ideas?

Upvotes: 0

Views: 135

Answers (1)

designosis
designosis

Reputation: 5263

Easy enough to fix via PHP. Assuming $items contains your records array ...

foreach ($items as $itemkey=>$item) {
    if ($item['display_name']) {

        // prep vars
        $displaynames = explode(';',$item['display_name']);
        $values = explode(';',$item['values']);
        $count = explode(';',$item['count']);
        unset($items[$itemkey]['values']);

        // iterate
        $i=0;
        foreach ($displaynames as $null) {
            $items[$itemkey]['values'][$i] = array(
                'display_name' => $displaynames[$i],
                'value'        => $values[$i],
                'count'        => $count[$i]
            );
            $i++;
        }

    } else {
        $items[$itemkey]['values'] = null;
    }
}

Upvotes: 1

Related Questions