ONYX
ONYX

Reputation: 5859

php second foreach doesn't write out values

I have a problem with displaying my data. I have data in the following

filter_name        filter_value
Hard Drize Size    16GB
Hard Drize Size    32GB
Screen Size        7''
Screen Size        8''

And I want to present it like this.

Hard Drize Size
16GB
32GB

Screen Size
7''
8''

What I want in my php code is to check if the filter_name is in the $temp array and if it isn't then add it to $temp array so it won't cause duplicate entries. The problem I'm getting now is when I use the same data to do a second foreach inside the loop I get no data and my sql is correct. So I don't know how to out put the values. With the second foreach it only prints out the first $filter_name["filter_name"] and that all.

php:

if($stmt->rowCount() > 0) 
{
    $filters = "<div class=\"filters\">         
    <div class=\"apply-filters\">Filters</div>";
    $temp = array();        
    $stmt->fetch(PDO::FETCH_ASSOC);

    foreach($stmt as $filter_name)
    {
        if(!in_array($filter_name["filter_name"], $temp)) 
        {
            $temp[] = $filter_name["filter_name"];
            $filters .= "<div class=\"filter-header\">".$filter_name["filter_name"]."</div>";
            //second loop here doesn't work with the same data.
            // test if filter_name["filter_name"] == second loop second_loop["filter_name"]
            // ten write out second_loop["filter_value"] e.g.
            foreach($stmt as $filter_value)
            {
                if($filter_name["filter_name"] == $filter_value["filter_name"])
                {
                    $filters .= $filter_value["filter_value"] ."<br />";
                }                  
            }

        }               
    }
    $filters .= "</div>";   
}

Upvotes: 0

Views: 281

Answers (5)

Fabio
Fabio

Reputation: 23480

i slightly modified your code to fit your needs:

$temp = array();
foreach($stmt as $filter_name)
{
    if(!in_array($filter_name["filter_name"], $temp)) 
    {
        echo '<b>' . $filter_name['filter_name'] . '</b><br>';
        $temp[] = $filter_name["filter_name"];

        foreach($stmt as $filter_value)
        {
            if($filter_name["filter_name"] == $filter_value["filter_name"])
            {
                echo $filter_value['filter_value'] . '<br>';
            }
        }
    }
}

you can check a working sample here -> http://codepad.viper-7.com/aFD079

Upvotes: 1

inquam
inquam

Reputation: 12932

First, do a var_dump of $stmt before the first and second foreach to look at it's form. Perhaps it's not formatted the way you think?

Why don't you loop over $stmt once and in that loop print $stmt['filter_name'] and $stmt['filter_value']? Now you loop $stmt one "extra" time for each iteration of the first foreach. Instead just do a foreach($stmt as $filter) and $filter, being a associative array, should contain filter_name and filter_value for each entry.

You could then move the actual printing outside of the foreach and only construct your array in the loop that should look something like

array("Hard Drive Size" => array("16GB", "32GB"), "Screen Size" => array("7''", "8''"));

Then you could traverse that data structure using

foreach($myArray as $filter_name => $filter_values)
{
  // Print filter name header
  foreach($filter_values as $filter_value)
  {
    // print each value of the specific filter
  }
}

To build the presented structure you could do something like

...

    $filters = array();

    foreach($stmt->fetchAll(PDO::FETCH_ASSOC) as $filter)
    {
      $filters[$filter['filter_name']][] = $filter['filter_value'];     
    }

...

Then iterate the $filters structure and print it.

Update:

From your var_dump of $stmt it's clear that $stmt is not your result set. You should assign the result of $stmt->fetch to something. Like $result = $stmt->fetch(PDO::FETCH_ASSOC) and then iterate over $result.

Check

http://php.net/manual/en/pdostatement.fetch.php

http://php.net/manual/en/pdostatement.fetchall.php

Upvotes: 2

Mark Parnell
Mark Parnell

Reputation: 9215

if($stmt->rowCount() > 0) 
{
    $filters = "<div class=\"filters\">         
    <div class=\"apply-filters\">Filters</div>";
    $temp = array();        
    $stmt->fetch(PDO::FETCH_ASSOC);

    foreach($stmt as $filter)
        $temp[$filter['filter_name']][] = $filter['filter_value']; 

    foreach($temp as $filter_name => $filter_values)
    {
        $filters .= "<div class=\"filter-header\">".$filter_name."</div>";
        foreach ($filter_values as $value)
            $filters .= $filter_value."<br />";
    }

    $filters .= "</div>";   
}

Upvotes: 0

JOE LEE
JOE LEE

Reputation: 1058

 $stmt->fetch(PDO::FETCH_ASSOC);

foreach($stmt as $filter_name)

may be (i am not sure)

 $aaa= $stmt->fetch(PDO::FETCH_ASSOC);

foreach($aaa as $filter_name)

and try

$rows = $stmt->fetch(PDO::FETCH_ASSOC);
$tmp_name='';
$html='';
foreach($rows as $row)
{
    if($row['filter_name'] !=  $tmp_name){
     $html .=$row['filter_name'];
    }
    $html .=$row['filter_value'];

    $tmp_name=$row['filter_name'];
}

echo $html;

Upvotes: 0

Ashwini Agarwal
Ashwini Agarwal

Reputation: 4858

You are missing $ before filter_value.

Change

foreach($stmt as filter_value)

To

foreach($stmt as $filter_value)

Upvotes: 0

Related Questions