Повторяющиеся значения настраиваемых полей


Я в растерянности. У меня есть пользовательский мета-блок с кодом "мультичека", который создал Ян. Это отлично работает. Моя проблема сейчас заключается в том, чтобы правильно вернуть данные.

Сценарий: существует 5 возможных значений, каждое с одним и тем же метаключем. То, что я пытаюсь сделать, - это отобразить конкретное содержимое, если значение хранится с одним из 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>';
                }
                } ?>
Author: Norcross, 2011-01-18

4 answers

Проблема заключается в вашем предначертании. Вы повторяете один раз для каждого предложения, но каждый раз оцениваете ВСЕ значения предложения в массиве. Таким образом, ваш PHP добросовестно печатает все доступные предложения * количество предложений. Я бы сказал, обойдитесь без foreach() и посмотрите, что произойдет.

РЕДАКТИРОВАТЬ 1 Также обратите внимание, что вы преобразуете строки в массивы. Вы пытаетесь найти значения в массиве на основе недопустимого ключа. $предложения ["горячие"] - $предложения ["дети"] не существуют, поскольку PHP обеспокоен. $предложения[0] - $предложения[4] ДЕЙСТВИТЕЛЬНО существуют.

РЕДАКТИРОВАТЬ 2 Хорошо, вы хотите следующее вместо вашего foreach():

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

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

И т.д.

РЕДАКТИРОВАТЬ 3

Или, если я подумаю об этом дальше, вы могли бы придерживаться foreach() следующим образом:

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

РЕДАКТИРОВАТЬ 4

Если бы вы имели дело с большим набором данных, я бы, вероятно, выбрал версию switch(), так как вызовы in_array() каждый раз сканируют весь массив, что может стать дорогостоящим, в то время как foreach() будет просто перебирать массив и перемещать указатель массива с каждой итерацией. Ваш звонок, но я думаю, что это был бы правильный путь для обеспечения надежности в будущем и производительности. (Снижение производительности массива из 5 значений для in_array(), вероятно, незначительно, но эти вещи складываются.)

 3
Author: ZaMoose, 2011-01-18 22:14:35

PHP оценит

$offering["someKey"]==true

Как верно для ключа, если значение для этого ключа не пустое, поэтому я подозреваю, что get_post_meta() возвращает что-то ("null" или даже "") для этих значений.

Попробуйте использовать

$offering["someKey"]===true

Для строгого равенства, и это должно сработать.

 2
Author: cori, 2011-01-18 21:44:53

Можете ли вы поделиться кодом, который вы используете для регистрации этих ящиков? Похоже, что каждый раз, когда вы сохраняете, каждое значение перезаписывает друг друга. Вам нужно будет сохранить значения в массив.

 0
Author: , 2011-01-18 21:34:49

Попробуйте это:

 <?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 ?>

Вот что я здесь сделал:

  1. Предварительно установите определения типов предложений. В идеале это было бы основано на данных, но поскольку это явно не так, это лучшая альтернатива.
  2. Сверьте определения с различными предложениями, доступными для... предложения*, и сложите их в массив.
  3. Если этот массив не пуст, отобразите соответствующий фрагмент HTML, заполняя атрибуты предложения по мере повторения массив.

*На самом деле, это то, что я почерпнул из ваших предложенных требований - что в данной программе есть набор предлагаемых действий, и что эти действия должны быть перечислены... или что-то в этом роде. Может быть, вы могли бы выразиться более ясно.

 0
Author: Fordi, 2011-01-19 18:48:24