0

I am trying to construct a table which shows price on product, but I cannot figure out how to match the data based on the key values.

I query the SQL db and get the following result. Date is actually the month

Product name  Price   date
care bear      11       4
care bear      12.5     5
care bear      9        6
car            123      3
car            344      4

.etc

The sql result is read to an array. Similar to table example.

Now I am trying to make a table that shows the name and price for the whole year, but I am stuck how to do this. The idea is the following.

    Product   jan feb mar apr may jun jul aug oct nov dec
    care bear  0   0   0  11  12.5  9  0   0   0   0   0
    car        0   0   3  4    0    0  0   0   0   0   0


// while there are products
    while (!empty($results[$k]['product'])) 
    {
// fill first cell with name.
echo '<td>'.$results[$k]['product'].'</td>';
// while the product has the same name
    while ($results[$i]['product'] = $results[$i-1]['product'] )
    {
//generate values for each month
        while ($i< 12) {
            if ($results[0]['month'] == $i){echo '<td>'.$results[0]['price'].'</td>';} 
                else if ($results[1]['month'] == $i){echo '<td>'.$results[1]['price'].'</td>';} 
                    else if ($results[2]['month'] == $i){echo '<td>'.$results[2]['price'].'</td>';}
                        else if ($results[3]['month'] == $i){echo '<td>'.$results[3]['price'].'</td>';}
                            else if ($results[4]['month'] == $i){echo '<td>'.$results[4]['price'].'</td>';}
                                else if ($results[5]['month'] == $i){echo '<td>'.$results[5]['price'].'</td>';}
                                    else if ($results[6]['month'] == $i){echo '<td>'.$results[6]['price'].'</td>';}
                                        else if ($results[7]['month'] == $i){echo '<td>'.$results[7]['price'].'</td>';}
                                            else if ($results[8]['month'] == $i){echo '<td>'.$results[8]['price'].'</td>';}
                                                else if ($results[9]['month'] == $i){echo '<td>'.$results[9]['price'].'</td>';}
                                                    else if ($results[10]['month'] == $i){echo '<td>'.$results[10]['price'].'</td>';}
                                                        else if ($results[11]['month'] == $i){echo '<td>'.$results[11]['price'].'</td>';}
                                                            else if ($results[12]['month'] == $i){echo '<td>'.$results[12]['price'].'</td>';}
                                                                //else if ($results[13]['month'] == $i){echo '<td>'.$results[13]['price'].'</td>';}
                                                                else echo '<td>0,00</td>';
            If($i==12)
            {
            echo '</tr><tr>';
            }
            $i++;
        }
    }
    $k++;
    }

There should be better ways of doing this and getting it actually to work, but for the death of me I can not come up with any...

Any help would be much appreciated.

1
  • 1
    That stairs of if would be much faster with a switch Commented Aug 7, 2014 at 12:27

2 Answers 2

1

If array is sorted alphabetically by product names then you can use this code to easily achieve what you want

$number_of_rows = count($results);
$i = 0;
while ($i < $number_of_rows) {
    $j = $i;
    $some_array = array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
    while ($results[$j]['product'] == $results[$i]['product']) {
        $some_array[$results[$j]['date']] = $results[$j]['price'];
        $j++;
    }
    echo '<tr><td>'.$results[$i]['product'].'</td>';
    for ($k = 1; $k <= 12; $k++)
        echo '<td>'.$some_array[$k].'</td>';
    echo '</tr>';
    $i = $j;
}

In second while you save prices to additional $some_array while there are the same products (it needs array to be sorted by product names). If there is no row for some month then the price is 0. At the end you echo the prices and assign to $i the value of $j so next loop will count prices of next product

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

1 Comment

That actually worked right of the bat and is nicer than anything I could come up with. THANK YOU. Great solution.
0

try this

$arr_output = array(); 
foreach($results as $arr)
{
    $product = $arr['product'];
    $price = $arr['price'];
    $month = $arr['month'];

    $flag = false;
    foreach($arr_output as $key=>$arr_val)
    {
        if($arr_val['product']==$product)
        {
            $flag = true;
            $arr_output[$key][$month] = $price;
        }
    }

    if($flag===false)
    {
        $arr_temp['product'] = $product;
        foreach($i=1; $i<=12; $i++)
        {
            $arr_temp[$i] = 0;
        }
        $arr_temp[$month] = $price;
        $arr_output[] = $arr_temp;
    }
}

$arr_header = array("product", "Jan", "Feb", "March", "Apr", "May", "June", "July", "Aug", "Sep", "Oct", "Nov", "Dec");

echo "<table>";

echo "<tr>";
foreach($arr_header as $header_text)
{
    echo "<th>".$header_text."</th>";
}
echo "<tr>";

foreach($arr_output as $key=>$array)
{
    echo '<tr>';
        echo '<td>'.$array['product'].'</td>';
        for($i=1; $i<=12; $i++)
        {
            echo '<td>'.$array[$i].'</td>';
        }
    echo '</tr>';
}
echo "</table>";

1 Comment

Do you mean with $product = $arr['product']; $price = $arr['price']; $month = $arr['month']; should be all the products, prices and months queried from db first? Now they are part of the same array and if I query them differently I will lose part of the join clauses

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.