DigitalSky
DigitalSky

Reputation: 141

PHP foreach to iterate JSON data output

Okay, so I'm trying to take some JSON data and output it into a PHP page. My PHP code looks like this so far:

<?php                                                                    
$string = 
    $string = 
    file_get_contents("https://service.digitalpour.com/BeerDashboard/api/v2/MenuItems/53716a8dfb890c0d68677264/1/Tap?apiKey=53926cc7fb890c0528735cde");

    $json_taps = json_decode($string, true);  


$t=1; 
echo '<div id="taplist-container">'; 

foreach ($json_taps as $beverage) { 

        $item_name = $beverage['MenuItemDisplayDetail']['DisplayName'];
        $producer_name = $beverage['MenuItemProductDetail']['FullProducerList'];
        $beverage_name = $beverage['MenuItemProductDetail']['BeverageNameWithVintage'];
        $beverage_style = $beverage['MenuItemProductDetail']['FullStyleName'];
        $beverage_color = $beverage['MenuItemProductDetail']['Beverage']['StyleColor'];
        $year = $beverage['MenuItemProductDetail']['Year'];
        $beverage_abv = $beverage['MenuItemProductDetail']['Beverage']['Abv'];
        $beverage_ibu = $beverage['MenuItemProductDetail']['Beverage']['Ibu'];
        $beverage_type = $beverage['MenuItemProductDetail']['BeverageType'];
        $beer_advocate = $beverage['MenuItemProductDetail']['Beverage']['BeerAdvocateUrl'];
        $rate_beer = $beverage['MenuItemProductDetail']['Beverage']['RateBeerUrl'];

        $price = $beverage['MenuItemProductDetail']['Prices'][0]['Price'];
        $size = $beverage['MenuItemProductDetail']['Prices'][0]['DisplayName'];

        $producer_location = "";
        $producer_url = "";
        switch($beverage_type) {
            case "Beer":
                $producer_location = $beverage['MenuItemProductDetail']['Beverage']['Brewery']['Location'];
                $producer_url = $beverage['MenuItemProductDetail']['Beverage']['Brewery']['BreweryUrl'];
                break;
            case "Cider":
                $producer_location = $beverage['MenuItemProductDetail']['Beverage']['Cidery']['Location'];
                $producer_url = $beverage['MenuItemProductDetail']['Beverage']['Cidery']['CideryUrl'];
                break;
            case "Mead":
                $producer_location = $beverage['MenuItemProductDetail']['Beverage']['Meadery']['Location'];
                $producer_url = $beverage['MenuItemProductDetail']['Beverage']['Meadery']['MeaderyUrl'];
                break;
            case "Wine":
                $producer_location = $beverage['MenuItemProductDetail']['Beverage']['Winery']['Location'];
                $producer_url = $beverage['MenuItemProductDetail']['Beverage']['Winery']['WineryUrl'];
                break;
            case "Kombucha":
                $producer_location = $beverage['MenuItemProductDetail']['Beverage']['KombuchaMaker']['Location'];
                $producer_url = $beverage['MenuItemProductDetail']['Beverage']['KombuchaMaker']['Url'];
                break;
            case "Soft Drink":
                $producer_location = $beverage['MenuItemProductDetail']['Beverage']['SoftDrinkMaker']['Location'];
                $producer_url = $beverage['MenuItemProductDetail']['Beverage']['SoftDrinkMaker']['Url'];
                break;
        }
        $date_put_on = $beverage['DatePutOn']; 
        $bottle_size = $beverage['MenuItemProductDetail']['Prices'][0]['Size'];   
        $bottle_price = $beverage['MenuItemProductDetail']['Prices'][0]['Price'];
        $beverage_ps = $beverage['MenuItemProductDetail']['Prices'][0]['DisplayName']; 
        $in_bottles = $beverage['MenuItemProductDetail']['AvailableInBottles'];
        $keg_size = $beverage['MenuItemProductDetail']['KegSize'];
        $oz_remaining = $beverage['MenuItemProductDetail']['EstimatedOzLeft'];
        $scale = 1.0; //


    //calculating percentage of keg remaining
    // Get Percentage out of 100
    if ( !empty($keg_size) ) { $percent = $oz_remaining  / $keg_size; } 
    else { $percent = 0; }

    // Limit to 100 percent (if more than the max is allowed)
    if ( $percent > 1 ) { $percent = 1; }     
    if ( $percent < 0 ) { $percent = .005; }     
    $percent_remaining = number_format($percent*100, 0);
    if ( $percent_remaining < 1 ) {$percent_remaining = "< 1";}

    //determine percent Left color
    //                  |-----------Red ---------------------------|   |-------Green--------------------| |Blue|
    $percent_left_color = (max(0,min(255,511 * (1-$percent))) * 65536) + (max(0,min(255,511 * $percent)) * 256) + 40;

    $html =  
        '<div class="keg-info">'.
        '<div class="boxfielddata" title="'.$percent_remaining.'% remaining" >'. 

        '<div class="brewery">'.(!empty($producer_url) ? '<a href="http://'.$producer_url.'" target="_blank">' : '</a>').$producer_name.'</a> '.'</div>'.
        '<div class="beverage-name">'.$beverage_name.'</div>'.
        '<div class="beverage-type">'.$beverage_style.'</div>'.
        '<div class="abv">ABV: '.$beverage_abv.'% | IBU: '.$beverage_ibu.'</div>'.
        '<div class="reviews">
            <a href="'.$beer_advocate.'" target="_blank" rel="nofollow">BeerAdvocate.com</a> | <a href="'.$rate_beer.'" target="_blank" rel="nofollow">RateBeer.com</a>
        </div>'.
        '<div class="beverage-type">'.$displaySize.'</div>'.
        '<span>'.($beverage_ps == '12oz' ? $beverage_ps : '').'</span>'.
        '<span style="position:relative;">'.($in_bottles == TRUE 
? '<a href="/dev/?page_id=7&so=brewery">Available in bottles!</a>' : 
'').'</span>'.    
//PERCENTAGE AND COLOR
        '<div class="percent-remaining" style="width:'.round(100 * $scale).'px;">'.
        '<div style="width:'.round(max($percent*100,5) * $scale).'px; height: 20px; background-color: #'.substr("000000".dechex($percent_left_color),-6).';"></div>'.
        '</div>'.
        '<div class="percent-number">'.$percent_remaining.'%</div>'.
        '</div></div>'.  

        ($t == $countnumrows ? '</div><div id="shim"></div><div id="datafieldcontainer">' : '');    

echo $html;
$t++;     
}

?>

The output from this works fantastic, however beverage has multiple sizes and prices depending on the size. For instance, you can access my JSON feed using the link in the above code, but this is a snippet of one of the beverages and it's different sizes / prices:

Year: 2015,
Attributes: [ ],
HasVintage: false,
    Prices: [
    {
    Size: 5,
    Price: 2,
    DisplayName: "Taster",
    DisplaySize: 5.5,
    UPCCode: null,
    Glassware: "Nonic (Small)",
    DisplayOnMenu: false
    },
    {
    Size: 9.5,
    Price: 4,
    DisplayName: "10oz",
    DisplaySize: 10,
    UPCCode: null,
    Glassware: "Nonic (Small)",
    DisplayOnMenu: true
    },
    {
    Size: 15.5,
    Price: 6,
    DisplayName: "16oz",
    DisplaySize: 16,
    UPCCode: null,
    Glassware: "Nonic",
    DisplayOnMenu: true
    },
    {
    Size: 35.2,
    Price: 11,
    DisplayName: "32oz",
    DisplaySize: 32,
    UPCCode: null,
    Glassware: "Growler",
    DisplayOnMenu: false
    },
    {
    Size: 70.4,
    Price: 18,
    DisplayName: "64oz",
    DisplaySize: 64,
    UPCCode: null,
    Glassware: "Growler",
    DisplayOnMenu: false
    }
    ],
EventPrices: null,
EventPricesActive: false,
EventId: null,
EventName: null,
DateAdded: "2015-12-09T18:57:30.517Z",
ProductFinished: false,
BeverageNameWithVintage: "Eliot IPA",
FullBeverageName: "Ex Novo Eliot IPA",
FullProducerList: "Ex Novo",
FullStyleName: "IPA - Hops (Galaxy, Simcoe, Centennial & Southern Cross)",
EventItem: false,
ReplaceableItem: false
},
Active: true,
DatePutOn: "2015-12-15T00:50:51.709Z",
DatePulledOff: null
},

So what I am trying to do is figure out how it is that I can output the different sizes and prices with the rest of the data I am outputting (see the PHP code above) and display the various available sizes and prices for each beverage kind of like this:

Taster: $2 10oz: $4 16oz: $6 32oz: $11 64oz: $18

And so on...

I figured out the code to make it work below:

foreach($beverage['MenuItemProductDetail']['Prices'] as $price) {
    echo '<p>'.$price['DisplayName'].': $'.$price['Price'].'</p>';
}

But I am unsure how to place that code inline with the html output below:

    $percent_left_color = (max(0,min(255,511 * (1-$percent))) * 65536) + (max(0,min(255,511 * $percent)) * 256) + 40;

    $html =  
        '<div class="keg-info">'.
        '<div class="boxfielddata" title="'.$percent_remaining.'% remaining" >'. 

        '<div class="brewery">'.(!empty($producer_url) ? '<a href="http://'.$producer_url.'" target="_blank">' : '</a>').$producer_name.'</a> '.'</div>'.
        '<div class="beverage-name">'.$beverage_name.'</div>'.
        '<div class="beverage-type">'.$beverage_style.'</div>'.
        '<div class="abv">ABV: '.$beverage_abv.'% | IBU: '.$beverage_ibu.'</div>'.
        '<div class="reviews">
            <a href="'.$beer_advocate.'" target="_blank" rel="nofollow">BeerAdvocate.com</a> | <a href="'.$rate_beer.'" target="_blank" rel="nofollow">RateBeer.com</a>
        </div>'.
        '<div class="beverage-type">'.$displaySize.'</div>'.
        '<span>'.($beverage_ps == '12oz' ? $beverage_ps : '').'</span>'.
        '<span style="position:relative;">'.($in_bottles == TRUE 
? '<a href="/dev/?page_id=7&so=brewery">Available in bottles!</a>' : 
'').'</span>'.    
//PERCENTAGE AND COLOR
        '<div class="percent-remaining" style="width:'.round(100 * $scale).'px;">'.
        '<div style="width:'.round(max($percent*100,5) * $scale).'px; height: 20px; background-color: #'.substr("000000".dechex($percent_left_color),-6).';"></div>'.
        '</div>'.
        '<div class="percent-number">'.$percent_remaining.'%</div>'.
        '</div></div>'.  

        ($t == $countnumrows ? '</div><div id="shim"></div><div id="datafieldcontainer">' : '');    

echo $html;
$t++;     
}

?>

Upvotes: 0

Views: 64

Answers (1)

Tim
Tim

Reputation: 485

Try this on for size. You can play around with the markup of course and refactor to your liking:

The new lines are:

lines 59-64:

$bottlePrices = $beverage['MenuItemProductDetail']['Prices'];

$pricesSizesHtml = "";
foreach($bottlePrices as $prices){
    $pricesSizesHtml .= $prices['DisplayName'] . ": $" . $prices['Price'] . "<br>";
}

and lines 111-112:

//Prices and Sizes
 '<div class="prices-sizes">'.$pricesSizesHtml.'</div>'.

Sample Output:

Ex Novo
Eliot IPA
IPA - Hops (Galaxy, Simcoe, Centennial & Southern Cross)
ABV: 6.6% | IBU: 65
BeerAdvocate.com | RateBeer.com
70%
Taster: $2
10oz: $4
16oz: $6
32oz: $11
64oz: $18

Code:

<?php                                                                    
$string = 
    $string = 
    file_get_contents("https://service.digitalpour.com/BeerDashboard/api/v2/MenuItems/53716a8dfb890c0d68677264/1/Tap?apiKey=53926cc7fb890c0528735cde");
    $json_taps = json_decode($string, true);  


$t=1; 
echo '<div id="taplist-container">'; 

foreach ($json_taps as $beverage) { 

        $item_name = $beverage['MenuItemDisplayDetail']['DisplayName'];
        $producer_name = $beverage['MenuItemProductDetail']['FullProducerList'];
        $beverage_name = $beverage['MenuItemProductDetail']['BeverageNameWithVintage'];
        $beverage_style = $beverage['MenuItemProductDetail']['FullStyleName'];
        $beverage_color = $beverage['MenuItemProductDetail']['Beverage']['StyleColor'];
        $year = $beverage['MenuItemProductDetail']['Year'];
        $beverage_abv = $beverage['MenuItemProductDetail']['Beverage']['Abv'];
        $beverage_ibu = $beverage['MenuItemProductDetail']['Beverage']['Ibu'];
        $beverage_type = $beverage['MenuItemProductDetail']['BeverageType'];
        $beer_advocate = $beverage['MenuItemProductDetail']['Beverage']['BeerAdvocateUrl'];
        $rate_beer = $beverage['MenuItemProductDetail']['Beverage']['RateBeerUrl'];

        $price = $beverage['MenuItemProductDetail']['Prices'][0]['Price'];
        $size = $beverage['MenuItemProductDetail']['Prices'][0]['DisplayName'];

        $producer_location = "";
        $producer_url = "";
        switch($beverage_type) {
            case "Beer":
                $producer_location = $beverage['MenuItemProductDetail']['Beverage']['Brewery']['Location'];
                $producer_url = $beverage['MenuItemProductDetail']['Beverage']['Brewery']['BreweryUrl'];
                break;
            case "Cider":
                $producer_location = $beverage['MenuItemProductDetail']['Beverage']['Cidery']['Location'];
                $producer_url = $beverage['MenuItemProductDetail']['Beverage']['Cidery']['CideryUrl'];
                break;
            case "Mead":
                $producer_location = $beverage['MenuItemProductDetail']['Beverage']['Meadery']['Location'];
                $producer_url = $beverage['MenuItemProductDetail']['Beverage']['Meadery']['MeaderyUrl'];
                break;
            case "Wine":
                $producer_location = $beverage['MenuItemProductDetail']['Beverage']['Winery']['Location'];
                $producer_url = $beverage['MenuItemProductDetail']['Beverage']['Winery']['WineryUrl'];
                break;
            case "Kombucha":
                $producer_location = $beverage['MenuItemProductDetail']['Beverage']['KombuchaMaker']['Location'];
                $producer_url = $beverage['MenuItemProductDetail']['Beverage']['KombuchaMaker']['Url'];
                break;
            case "Soft Drink":
                $producer_location = $beverage['MenuItemProductDetail']['Beverage']['SoftDrinkMaker']['Location'];
                $producer_url = $beverage['MenuItemProductDetail']['Beverage']['SoftDrinkMaker']['Url'];
                break;
        }
        $date_put_on = $beverage['DatePutOn']; 
        $bottle_size = $beverage['MenuItemProductDetail']['Prices'][0]['Size'];   
        $bottle_price = $beverage['MenuItemProductDetail']['Prices'][0]['Price'];
        $bottlePrices = $beverage['MenuItemProductDetail']['Prices'];

        $pricesSizesHtml = "";
        foreach($bottlePrices as $prices){
            $pricesSizesHtml .= $prices['DisplayName'] . ": $" . $prices['Price'] . "<br>";
        }

        $beverage_ps = $beverage['MenuItemProductDetail']['Prices'][0]['DisplayName']; 
        $in_bottles = $beverage['MenuItemProductDetail']['AvailableInBottles'];
        $keg_size = $beverage['MenuItemProductDetail']['KegSize'];
        $oz_remaining = $beverage['MenuItemProductDetail']['EstimatedOzLeft'];
        $scale = 1.0; //


    //calculating percentage of keg remaining
    // Get Percentage out of 100
    if ( !empty($keg_size) ) { $percent = $oz_remaining  / $keg_size; } 
    else { $percent = 0; }

    // Limit to 100 percent (if more than the max is allowed)
    if ( $percent > 1 ) { $percent = 1; }     
    if ( $percent < 0 ) { $percent = .005; }     
    $percent_remaining = number_format($percent*100, 0);
    if ( $percent_remaining < 1 ) {$percent_remaining = "< 1";}

    //determine percent Left color
    //                  |-----------Red ---------------------------|   |-------Green--------------------| |Blue|
    $percent_left_color = (max(0,min(255,511 * (1-$percent))) * 65536) + (max(0,min(255,511 * $percent)) * 256) + 40;

    $html =  
        '<div class="keg-info">'.
        '<div class="boxfielddata" title="'.$percent_remaining.'% remaining" >'. 

        '<div class="brewery">'.(!empty($producer_url) ? '<a href="http://'.$producer_url.'" target="_blank">' : '</a>').$producer_name.'</a> '.'</div>'.
        '<div class="beverage-name">'.$beverage_name.'</div>'.
        '<div class="beverage-type">'.$beverage_style.'</div>'.
        '<div class="abv">ABV: '.$beverage_abv.'% | IBU: '.$beverage_ibu.'</div>'.
        '<div class="reviews">
            <a href="'.$beer_advocate.'" target="_blank" rel="nofollow">BeerAdvocate.com</a> | <a href="'.$rate_beer.'" target="_blank" rel="nofollow">RateBeer.com</a>
        </div>'.
        '<div class="beverage-type">'.$displaySize.'</div>'.
        '<span>'.($beverage_ps == '12oz' ? $beverage_ps : '').'</span>'.
        '<span style="position:relative;">'.($in_bottles == TRUE 
? '<a href="/dev/?page_id=7&so=brewery">Available in bottles!</a>' : 
'').'</span>'.    
//PERCENTAGE AND COLOR
        '<div class="percent-remaining" style="width:'.round(100 * $scale).'px;">'.
        '<div style="width:'.round(max($percent*100,5) * $scale).'px; height: 20px; background-color: #'.substr("000000".dechex($percent_left_color),-6).';"></div>'.
        '</div>'.
        '<div class="percent-number">'.$percent_remaining.'%</div>'.
        '</div></div>'.

        //Prices and Sizes
         '<div class="prices-sizes">'.$pricesSizesHtml.'</div>'.

        ($t == $countnumrows ? '</div><div id="shim"></div><div id="datafieldcontainer">' : '');    

echo $html;
$t++;     
}

?>

Upvotes: 1

Related Questions