0

I have this query

select * from template_product where template_id = 8 group by class_id, product_id

which returns

 template_product_id  template_step_id     step_number    product_id    class_id      template
16                   11                     1            54            1              8
17                   11                     1            56            1              8
18                   11                     1            57            1              8
19                   11                     1            58            1              8
20                   11                     1            54            2              8
21                   11                     1            56            2              8
22                   11                     1            57            2              8
23                   11                     1            58            2              8
24                   11                     1            59            2              8
25                   11                     1            60            2              8
26                   11                     1            63            2              8
27                   11                     1            64            2              8
28                   11                     1            52            2              8
29                   11                     1            54            3              8
30                   11                     1            52            3              8
31                   12                     2            61            1              8
32                   12                     2            62            2              8
33                   12                     2            61            3              8

from this data, how do I create an array like this

Array
(
    [0] => Array
        (
            [step_number] => 1
            [first_class] => [54, 56, 57, 58]
            [second_class] => [54, 56, 57, 58, 59, 60, 63, 64, 52]
            [third_class] => [54, 52]
        )                      

    [1] => Array               
        (                      
              [step_number] => 2
              [first_class] => [61]
              [second_class] => [62]
              [third_class] => [61]
        )
)

Basically, each step number is a new array and the class_id is either first_class, second_class, third_class based on whether it's 1, 2 or 3 and lastly each product_id is in an array in each ...

Any ideas how to create this array

2 Answers 2

1

Here is a solution:

<?php
$records = array(
    array('step_number' => 1, 'class_id' => 1, 'product_id' => 54),
    array('step_number' => 1, 'class_id' => 1, 'product_id' => 56),
    array('step_number' => 1, 'class_id' => 1, 'product_id' => 57),
    array('step_number' => 1, 'class_id' => 1, 'product_id' => 58),
    array('step_number' => 1, 'class_id' => 2, 'product_id' => 54),
    array('step_number' => 1, 'class_id' => 2, 'product_id' => 56),
    array('step_number' => 1, 'class_id' => 2, 'product_id' => 57),
    array('step_number' => 2, 'class_id' => 2, 'product_id' => 58),
    array('step_number' => 2, 'class_id' => 2, 'product_id' => 59),
    array('step_number' => 2, 'class_id' => 2, 'product_id' => 60),
    array('step_number' => 2, 'class_id' => 2, 'product_id' => 63),
    array('step_number' => 2, 'class_id' => 2, 'product_id' => 64),
);

$new_array = array();
foreach($records as $record => $row) {
    $class = '';
    switch ($row['class_id']) {
        case '1':
            $class = 'first_class';
            break;
        case '2':
            $class = 'second_class';
            break;
        case '3':
            $class = 'third_class';
            break;
    }
    $new_array['step_number'][$row['step_number']][$class][] = $row['product_id'];
}

print_r($new_array);
?>

Now just update to pull from your database.

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

Comments

1

Something like this should work :

$result = array();
$currentStepNumber = null;

foreach ($table as $item)
{
    $stepNumber = $item['step_number'];

    if ($stepNumber != $currentStepNumber)
    {
        $result[] = array(
            'step_number' => $stepNumber,
            'first_class' => array(),
            'second_class' => array(),
            'third_class' => array()
        );

        $currentStepNumber = $stepNumber;
    }

    switch ($item['class_id'])
    {
        case 1:
            $result[count($result) - 1]['first_class'][] = $item['product_id'];
            break;

        case 2:
            $result[count($result) - 1]['second_class'][] = $item['product_id'];
            break;

        case 3:
            $result[count($result) - 1]['third_class'][] = $item['product_id'];
            break;

        default:

    }
}

var_dump($result);

where $table is your data from the sql request.

1 Comment

There is risk in your logic. This is assuming all of the records come out in order by step_number or you will have multiple arrays with the same step_number. So if you get 3 records where step_number = 1, the 4th record with step_number = 2, and the 5th with step_number = 1, you will have two arrays where step_number = 1.

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.