Custom field values repeating

时间:2011-01-18 作者:Norcross

我不知所措。我有一个带有Jan创建的“multicheck”代码的自定义元框。它工作得很好。我现在的问题是如何正确返回数据。

场景:有5个可能的值,每个值都具有相同的meta\\u键。我试图做的是,如果使用5个可能值中的一个存储值,则显示特定内容。所发生的是内容在重复。

当前站点:http://dev.andrewnorcross.com/yoga/locations/tampa/

当前代码:

    <?php
    global $post;
$offerings = get_post_meta($post->ID, "evol_offerings_select", false);
if ($offerings[0]=="") { ?>

<!-- If there are no custom fields, show nothing -->

<?php } else { ?>

<div class="offerings">
    <h3>offerings:</h3>
            <?php 
            foreach ($offerings as $offering) {
                if ($offering["hot"]==true) {
                    echo "<div class=\'single_offering\'>";
                    echo "<h3>Hot 90</h3>";
                    echo "<p class=\'class_info\'>temp: 105&deg;&nbsp;&nbsp;&nbsp;time: 90 min</p>";
                    echo \'</div>\';
                }
                if ($offering["flow"]==true) {
                echo "<div class=\'single_offering\'>";
                echo "<h3>Flow 75</h3>";
                echo "<p class=\'class_info\'>temp: 80&deg;&nbsp;&nbsp;&nbsp;time: 75 min</p>";
                echo \'</div>\';
                }
                if ($offering["warm"]==true) {
                echo "<div class=\'single_offering\'>";
                echo "<h3>Warm 60</h3>";
                echo "<p class=\'class_info\'>temp: 90&deg;&nbsp;&nbsp;&nbsp;time: 60 min</p>";
                echo \'</div>\';
                }
                if ($offering["chill"]==true) {
                echo "<div class=\'single_offering\'>";
                echo "<h3>Chill 30</h3>";
                echo "<p class=\'class_info\'>temp: 75-80&deg;&nbsp;&nbsp;&nbsp;time: 30 min</p>";                    
                echo \'</div>\';
                }
                if ($offering["kids"]==true) {
                echo "<div class=\'single_offering\'>";
                echo "<h3>Kids Class</h3>";
                echo "<p class=\'class_info\'>temp: comfy&nbsp;&nbsp;&nbsp;time: 60 min</p>";
                echo \'</div>\';
                }
                } ?>

3 个回复
最合适的回答,由SO网友:ZaMoose 整理而成

问题出在你身上。您对每个产品迭代一次,但每次都要评估数组中的所有产品值。因此,您的PHP正在尽职尽责地打印所有可用产品*产品数量。我会说,不要使用foreach()看看会发生什么。

EDIT 1另外请注意,您正在向数组强制转换字符串。您试图查找基于无效键的数组中的值$就PHP而言,产品[“热门”]-$产品[“儿童”]不存在$产品[0]-$产品[4]确实存在。

EDIT 2好的,您需要以下内容来代替foreach():

if(in_array("hot", $offerings)){
// print hot results
}

if(in_array("chill", $offerings)){
//print chill results
}
等等。

EDIT 3

或者,如果我进一步考虑,可以按以下方式使用foreach():

foreach($offerings as $offering){
 switch($offering){
   case "hot":
    //print hot stuff
   break;
   case "chill":
    //print chill stuff
   break;
 }
}

EDIT 4

如果您处理的是较大的数据集,我可能会使用switch()版本,因为in\\u array()调用每次都会扫描整个数组,这可能会很昂贵,而foreach()只会遍历数组,并在每次迭代时移动数组指针。你的电话,但我认为这将是未来证明和性能证明的方式。(对in\\u array()的5值数组的性能影响可能很小,但这些因素加在一起。)

SO网友:cori

PHP将评估

$offering["someKey"]==true
对于键,只要该键的值不为空,则为true,因此我怀疑get\\u post\\u meta()为这些值返回了一些内容(“null”甚至“”)。

尝试使用

$offering["someKey"]===true
为了严格的平等,这应该是有效的。

SO网友:Fordi

试试这个:

 <?php
    global $post;
    $offerings = get_post_meta($post->ID, "evol_offerings_select", false);
    $offeringDefinitions = array(
        \'hot\'   =>(object)array(\'name\'=>\'Hot 90\',       \'temp\'=>\'105\',      \'time\'=>\'90\'),
        \'flow\'  =>(object)array(\'name\'=>\'Flow 75\',      \'temp\'=>\'80\',       \'time\'=>\'75\'),
        \'warm\'  =>(object)array(\'name\'=>\'Warm 60\',      \'temp\'=>\'90\',       \'time\'=>\'60\'),
        \'chill\' =>(object)array(\'name\'=>\'Chill 30\',     \'temp\'=>\'75-80\',    \'time\'=>\'30\'),
        \'kids\'  =>(object)array(\'name\'=>\'Kids Class\',   \'temp\'=>\'comfy\',    \'time\'=>\'60\')
    );
    $offeringsInUse = array();
    forEach($offerings as $offering) {
        forEach($offeringDefinitions as $offeringName=>$offeringDefinition) {
            if ($offering[$offeringName]) $offeringsInUse[$offeringName]=$offeringDefinition;
        }
    }
?>
<?php if (count($offeringsInUse)>0): ?>
    <div class="offerings">
        <h3>offerings:</h3>
        <?php forEach ($offeringsInUse as $offering): ?>
            <div class="single_offering">
                <h3><?php echo $offering->name ?></h3>
                <p class="class_info">temp: <?php echo $offering->temp ?>&deg;&nbsp;&nbsp;&nbsp;time: <?php echo $offering->time ?>min</p>
            </div>
        <?php endForEach ?>
    </div>
<?php endIf ?>
我在这里所做的是:

预设产品类型的定义。理想情况下,这将是数据驱动的,但显然不是,这是最好的选择

结束

相关推荐