[РЕШЕНО] Условный оператор и логическое выражение в PHP

Главные вкладки

Аватар пользователя XDmitry XDmitry 21 августа 2010 в 17:47

День добрый, сообщество!

Вопрос к специалистам PHP. Есть конструкция (вроде правильная?):


<?php if (логическое выражение_1): ?>

    <?php “оператор_ 1” ?>

<?php elseif (логическое выражение_2): ?>

    <?php “оператор_2” ?>

<?php else: ?>

    <?php “оператор_3” ?>
          
<?php endif; ?>

Может что намудрил, короче: если выражение_1 TRUE (в массиве есть хотябы одно значение), исполнить оператор_1.
Если FALSE, то: если выражение_2 TRUE, исполнить оператор_2. Если выражение_2
FALSE, то выполнить оператор_3. Весь код будет в шаблоне …tpl.php.

Логическое выражение_1 это:

<?php
foreach ((array)$node->field_salary_agreement_vac as $item) {
    print 
$item['view']
}
?>

Логическое выражение_2 это:

<?php
$node
->field_age_vac[0]['view']
?>

.
Здесь понятно, будет так: <?php elseif ($node->field_age_vac[0]['view']): ?>

А вот логическое выражение_1 как составить? Спасибо

Комментарии

Аватар пользователя XDmitry XDmitry 22 августа 2010 в 1:20

Уточнение. Существует поле CCK, где пользователь может ввести определенные значения. Результат выводится при помощи функции перебора массива:

<?php
foreach ((array)$node->field_salary_agreement_vac as $item) {
    print 
$item['view']
}
?>

Однако, если пользователь ничего не вводил, массив будет пустой. Вот и нужно составить условие: если значения в массиве есть, оператор_1 выполнится. Если значений нет, произойдет переход к elseif (логическое выражение_2).

Аватар пользователя volocuga@drupal.org volocuga@drupal.org 22 августа 2010 в 3:11

Брат, я такой же программер как и ты

Где то так

<?php

if (in_array("что_ищем"$arr)) { // $arr - массив, в котором нада найти
    
print "FOUND!!!"//Если нашлось, возвращается единица, этот текст покажется
}

?>
Аватар пользователя XDmitry XDmitry 22 августа 2010 в 13:19

Так пробовал, тоже безрезультатно...


<?php 
    
foreach ((array)$node->field_salary_agreement_vac as $item) {
        
$result count($item['view']);
        if (
$result 0) {
            print 
$item['view'];//выполняется условие
        
}
        else {
            print 
'none value';// дефолтное значение
        
}
    }
 
?>
Аватар пользователя Ch Ch 22 августа 2010 в 16:25

Не совсем ясно, что нужно получить.

<?php
$output 
'';
foreach(
$node->field_salary_agreement_vac as $item) {
   
$output .= $item['view'];
}
print 
$output $output 'none value';
?>
Аватар пользователя XDmitry XDmitry 22 августа 2010 в 17:18

Ch wrote:
Не совсем ясно, что нужно получить.

<?php
$output 
'';
foreach(
$node->field_salary_agreement_vac as $item) {
   
$output .= $item['view'];
}
print 
$output $output 'none value';
?>

Отлично! Заработало. Возможно я не правильно изъяснил задачу. Вот код из шаблона …tpl.php:

Код_1:

<?php
<h2 class="vacancy-title-two">
    &
#040;<?php print t('from'); ?>
    <?php print $node->field_salary_vac[0]['view'?>
  <?php if ($node->field_salary_max_vac[0]['view']): ?>
    <?php print t('to'); ?>
    <?php print $node->field_salary_max_vac[0]['view'?>
  <?php endif; ?>
    <?php print $node->field_currency_vac[0]['view'?>&#041;
</h2>
?>

Тут три поля CCK (последовательно): 1. Выводит (зарплату «от») число, 2. Выводит (зарплату «до») число, 2.Выводит валюту (руб, usd …) текст. Все примерно так «наименование вакансии (от 25 000 до 35 000 РУБ)»
Есть еще одно поле (выведено через content template) :

Код_2:

<?php
<div class="field field-type-number-integer field-field-salary-agreement-vac">
  <
h3 class="field-label">или</h3>
  <
div class="field-items">
    <?
php foreach ((array)$node->field_salary_agreement_vac as $item) { ?>
      <div class="field-item"><?php print $item['view'?></div>
    <?php ?>
  </div>
</div>
?>

Через него пользователь в форме указывает значение (зарплата): «по договоренности». Получаем, если пользователь указал это значение, то код_1 не выполняется (ибо получится «зарплата: от 25 000 до 35 000 РУБ. по договоренности»), а выводится значения массива (т.е. код_2 – зарплата: по договоренности). Однако, если пользователь вообще ничего не указывал, то должен выполниться код_3:

Код_3:

<?php
<div>
  <
span><?php print “зарплатане указано” ?></span>
</div>
?>

С Вашим кодом первые два кода работают. Но вот как сделать третье условие?

Аватар пользователя XDmitry XDmitry 22 августа 2010 в 17:50

Что-то не соображу уже. Как их соединить?


<?php
$output 
'';
foreach(
$node->field_salary_agreement_vac as $item) {
   
$output .= $item['view'];
}
print 
$output $output 'none value';
?>

и


<?php if(!$output_1 && !$output_2): ?>
<div>
  <span><?php print “зарплатане указано” ?></span>
</div>
<?php endif ?>
Аватар пользователя XDmitry XDmitry 22 августа 2010 в 18:23

Я плохо владею (если не сказать, что вообще не владею) PHP. Так не правильно?


<?php
    $output_1 
'';
    foreach(
$node->field_salary_agreement_vac as $item) {
       
$output_2 .= $item['view'];
    }
    print 
$output_2 $output_1 'none value';
    

    if(!

$output_1 && !$output_2):
    print 
"зарплата не указана";
    endif;
?>
Аватар пользователя XDmitry XDmitry 22 августа 2010 в 19:24

Немного модернизировал. Вместо ‘none value’ вставил: $node->field_salary_vac[0]['view'] Это поле выводит зарплату (число).


<?php
$output_1 
'';
    foreach(
$node->field_salary_agreement_vac as $item) {
       
$output_2 .= $item['view'];
    }
    print 
$output_2 $output_2 $node->field_salary_vac[0]['view'];
    

    if(!

$output_1 && !$output_2):
    print 
"none salary";
    endif;
?>

Получаем, если в $item['view'] есть значение, то оно выводится на экран и ничего более (так и должно). Если там значений нет, выводится значение из $node->field_salary_vac[0]['view'], и если оно там есть, то оно выводится на экран вместе с «зарплата не указана» (так не должно). Если ни в $item['view'] и ни в $node->field_salary_vac[0]['view'] ничего нет, то выводится «зарплата не указана» (как и должно). Что необходимо поправить?

А также. Вместо $node->field_salary_vac[0]['view']; в итоге предполагается целая «вереница» кода:

<?php
<h2 class="vacancy-title-two">
    &
#040;<?php print t('from'); ?>
    <?php print $node->field_salary_vac[0]['view'?>
  <?php if ($node->field_salary_max_vac[0]['view']): ?>
    <?php print t('to'); ?>
    <?php print $node->field_salary_max_vac[0]['view'?>
  <?php endif; ?>
    <?php print $node->field_currency_vac[0]['view'?>&#041;
</h2>
?>

Как это реализовать? …print $output_2 ? $output_2 : здесь этот код…

Аватар пользователя XDmitry XDmitry 22 августа 2010 в 21:11

Все крутится во-круг кода:

<?php
1
)<h2 class="vacancy-title-two">
2)  <?php if ($node->field_salary_vac[0]['view']): ?>
3)    &#040;<?php print t('от'); ?>
4)      <?php print $node->field_salary_vac[0]['view'?>
5)  <?php endif; ?>
6)  <?php if ($node->field_salary_max_vac[0]['view']): ?>
7)    <?php print t('до'); ?>
8)    <?php print $node->field_salary_max_vac[0]['view'?>
9)  <?php endif; ?>
10)    <?php print $node->field_currency_vac[0]['view'?>
11)  <?php foreach ((array)$node->field_salary_agreement_vac as $item) { ?>
12)      <?php print $item['view'?>
13)  <?php ?>
14)  <?php print t('не указано'); ?>
15)  &#041;
16)</h2>
?>

Он располагается в шаблоне (сам шаблон большой). Это все поля CCK. Его задача, вывести значения зарплаты. С 2) – 5)строки, если условие TRUE, выводится: «(от XX XXX » где XX XXX это число сохраненное в $node->field_salary_vac[0]['view'].

С 6) – 9) строки, если условие TRUE, выводится: «до ХХ ХХХ », где ХХ ХХХ это число сохраненное в <?php print $node->field_salary_max_vac[0]['view'] ?> Далее в строке 10) выводится валюта. И вот этот самый код в строке 11) – 13), где пользователь вводит значение «по договоренности», которое записывается в массив. Если будут введены все значения, то получится (от ХХ ХХХ до ХХ ХХХ РУБ по договоренности не указано). Это не правильно. Нужно, если массив (строки 11 - 13) TRUE, выведится: (по договоренности). Если массив пустой, то выводятся строки: 3-4, 7-8 и 10. Если они также пусты, нужно вывести строку 14, т.е. (не указано). Понимаю, что условия построены не совсем грамотно, но думаю суть понятна. Вот собственно и задача. Все выходные голову ломаю.

Аватар пользователя XDmitry XDmitry 23 августа 2010 в 0:06

Вот еще упростил

<?php
<h2>    
    <?
php //первый код
    
if ($node->field_salary_vac[0]['view']) {
        print 
'<span>&#040;'t('from') .' </span>';
        print  
$node->field_salary_vac[0]['view'];
            if (
$node->field_salary_max_vac[0]['view']) {
                print 
'<span> 't('to') .' </span>';
                print  
$node->field_salary_max_vac[0]['view'] ;
            }
            if (
$node->field_currency_vac[0]['view']) {
                print 
'<span> '$node->field_currency_vac[0]['view'] .'</span>';
            }
        print 
'<span>&#041;</span>';    
    }
    
?>

    
    <?php //второй код
    
foreach ((array)$node->field_salary_agreement_vac as $item) { 
         print 
'&#040;'$item['view'] .'&#041;';
    } 
    
?>    
    
    
    <?php //третий код
    
print '&#040;'t('Salary not specified') .'&#041;';
    
?>
</h2>
?>

если в массиве во втором коде есть значения (true), тогда оно выводится (print), а первый и третий коды при этом не выполняются.
Если в массиве во втором коде нет значений (false), то выполняется только первый код. Если условие
if ($node->field_salary_vac[0]['view']) в первом коде false (соответственно все остальные операторы
первого кода не выполняются), то выполняется только третий код.

Аватар пользователя XDmitry XDmitry 23 августа 2010 в 1:04

Наконец то на ум пришло решение. По крайней мере все работает. Блин, двое суток без отдыха. Проверьте, код написан грамотно или есть замечания?:

<?php
<h2 class="vacancy-title-two">    
    <?
php
    
if ($node->field_salary_vac[0]['view']) {
        print 
'<span>&#040;'t('from') .' </span>';
        print  
$node->field_salary_vac[0]['view'];
            if (
$node->field_salary_max_vac[0]['view']) {
                print 
'<span> 't('to') .' </span>';
                print  
$node->field_salary_max_vac[0]['view'] ;
            }
            if (
$node->field_currency_vac[0]['view']) {
                print 
'<span> '$node->field_currency_vac[0]['view'] .'</span>';
            }
        print 
'<span>&#041;</span>';    
    }
    else {
            
$output '';
        foreach(
$node->field_salary_agreement_vac as $item) {
           
$output .= $item['view'];
        }
        print 
$output $output '&#040;'t('Salary not specified') .'&#041;';

    }
    

?>
</h2>
?>

Большое спасибо Ch за подсказку и volocuga за отзыв.