Подскажите как выполнить условие в цикле один раз.

Тема в разделе "Как сделать...", создана пользователем same_ivan, 9 авг 2014.

  1. same_ivan

    same_ivan Постоялец

    Регистр.:
    1 авг 2014
    Сообщения:
    115
    Симпатии:
    65
    Добрый день! Я не программист.. я дизайнер.

    Есть цикл. В нем есть условие, если условие выполняется то для li я проставляю соответствующие классы.
    Скажите пожалуйста, возможно ли выполнить условие которое внутри цикла - один раз. Мне это надо для того чтоб присвоить класс только первой li.
    Собственно так это выглядит:

    PHP:
            foreach ($this->getItemsAsArray() as $item){
                
    $check $item['label'];
                if (
    preg_match("/^[A-Z]+$/"$check)) {$bingo 'eng-sym';}
                else if (
    preg_match("/^[А-Я]+$/"$check)) {$bingo 'rus-sym';}
                else {
    $bingo 'other-sym';}
                echo 
    '<li'.$item['style'].' class="'.$bingo.' cells"><a class="'.$item['css'].'" href="'.$item['url'].'">'$item['label'] . '</a>' $item['count'] . '</li>';
            }
     
  2. DonPrus

    DonPrus Писатель

    Регистр.:
    28 июл 2014
    Сообщения:
    9
    Симпатии:
    12
    Очень сильно сомнительно выглядит ваш код, но в данном случае можете просто задать какой то флаг, $flag = true;
    И потом при первой замене, сделайте его flase;
    В итоге проверка if($flag){} поможет вам определить был ли изменен ваш код или ещё нет.
     
    same_ivan нравится это.
  3. same_ivan

    same_ivan Постоялец

    Регистр.:
    1 авг 2014
    Сообщения:
    115
    Симпатии:
    65
    спасибо, а подскажите в чем сомнителен мой код? какие могут быть проблемы?
     
    DonPrus нравится это.
  4. DonPrus

    DonPrus Писатель

    Регистр.:
    28 июл 2014
    Сообщения:
    9
    Симпатии:
    12
    Я вижу, что вы здесь и классы и вывод всё в одно намешали, нарушив все приципы ООП :)
    Почему бы не вынести в отдельный метод определение языка, ведь оно может потребоваться где-нибудь ещё позже?
    Почему бы не записывать в переменную то, что вы сразу хотите вывести на экран? А если в другом месте потребуется вывести этот список, вы второй и третий раз будете дублировать код? Не лучше ли сейчас потратить чуть-чуть больше времени, и грамотно и красиво всё оформить, чтобы потом сэкономить себе массу времени?
    $this->list .= "<li {$item['style']} class='{$bingo} cells'><a class='{$item['css']}' href='{$item['url']}'>{$item['label']}</a>{$item['count']}</li>";
    Наверняка было сложно со всеми эти конкатенациями разобраться и нигде не напутать? Я вот кавычки просто сменил и уже легче.
    А в принципе можно и heredoc синтаксис использовать для таких дел. Это как двойные кавычки, без двойных кавычек :)
    Если вы используете ООП - используйте все её хорошие стороны. Вот я в свойство list принадлежащее классу в котором мы сейчас находимся присвоил значение строки. Обратите внимание на точку перед равно - мы склеиваем все результаты foreach и у нас получится одна строковая переменная со всем списком.
    Затем, внутри этого класса, где нам нужно мы просто сделаем echo $this->list; и получим всё то же самое. Но теперь, этот код готов для повторного использования, и более того, если мы вставим кучу таких вот вызовов в проекте, а потом вам надо будет что-нибудь поменять, мы изменив всего в одном месте кода изменим во всём проекте.
    Ещё более гибко можно было бы сделать метод printList() в котором пока вы бы просто делали echo $this->list, а в самом проекте выводили бы $this->printList(); Захотите позже что-нибудь менять, дописать и прочее? Нет необходимости по всему проекту лезть, просто в методе замену сделали, и при необходимости в цикле. То есть любое изменение в максимум 2х местах.
    Если хотите чтобы я вам подсказал и возможно показал код, хотя я более чем уверен, что если вы дошли до этого момента, вы и сами разберетесь, но всё же, можете скинуть класс, в котором вы работаете. Конечно улучшать можно до бесконечности, нет предела, пойти дальше - использовать паттерны проектирования и прочее, но думаю такой задачи пока не стоит :)
    Поэтому код в принципе не плохой, но для очень маленького проекта, где вы точно 1 раз его используете, и не будете менять :)
     
    same_ivan нравится это.
  5. janhelly

    janhelly Писатель

    Регистр.:
    12 фев 2013
    Сообщения:
    1
    Симпатии:
    1
    Используйте счетчик $i объявленный до цикла

    $i = 0;
    foreach ($this->getItemsAsArray() as $item){$check = $item['label'];
    if (preg_match("/^[A-Z]+$/", $check)) {$bingo = 'eng-sym';}
    else if (preg_match("/^[А-Я]+$/", $check) && $i == 0) {
    $bingo = 'rus-sym';
    $i++
    }
    else {$bingo = 'other-sym';}
    echo '<li'.$item['style'].' class="'.$bingo.' cells"><a class="'.$item['css'].'" href="'.$item['url'].'">'. $item['label'] . '</a>' . $item['count'] . '</li>';
    }
     
  6. Q_BASIC

    Q_BASIC

    Регистр.:
    30 ноя 2013
    Сообщения:
    406
    Симпатии:
    280
    Тут можно убрать просто foreach(), так:
    PHP:
    $item each$this->getItemsAsArray() );

    $check $item['label'];
    if (
    preg_match("/^[A-Z]+$/"$check)) {$bingo 'eng-sym';}
        else if (
    preg_match("/^[А-Я]+$/"$check)) {$bingo 'rus-sym';}
            else {
    $bingo 'other-sym';}

    echo 
    '<li'.$item['style'].' class="'.$bingo.' cells"><a class="'.$item['css'].'" href="'.$item['url'].'">'$item['label'] . '</a>' $item['count'] . '</li>';
     
    Последнее редактирование: 18 сен 2014