За последние 24 часа нас посетили 47312 программистов и 1806 роботов. Сейчас ищут 928 программистов ...

А в PHP есть JUMP?

Тема в разделе "Вопросы от блондинок", создана пользователем akrinel, 2 фев 2009.

  1. akrinel

    akrinel Активный пользователь

    С нами с:
    26 янв 2009
    Сообщения:
    955
    Симпатии:
    1
    Адрес:
    Spb
    Ну вот типа делаем мы банальное меню в цикле:

    PHP:
    1.  
    2. <?php
    3. foreach($items as $item){
    4.      if($item['current']){
    5.     // типа текущий пункт меню
    6.     }
    7.     else{
    8.      //Типа все остальные
    9.     }
    10. }
    11. ?>
    12.  
    Т.е. получается, если у нас текущий пункт меню первый то дальше условие работает "вхолостую"

    А хочется что-то вроде:

    PHP:
    1.  
    2. <?php
    3. foreach($items as $item){
    4.      if($item['current']){
    5.     // типа текущий пункт меню
    6.     // КИЯЯЯЯ прыгам вниз
    7.     }
    8.     else{
    9.      //Типа все остальные
    10.     }
    11. }
    12.  
    13. //Внизу типа внутренний указатель массива остался там же поэтому
    14. foreach($items as $item){
    15.    // Типа все остальное
    16. }
    17. ?>
    18.  
    Наверн можно как-то с функциями такую штуку сделать.. но хочется типа просто, такое бывает вообще? :)

    P.S. Не спрашивайте зачем мне эту нужно, просто сидел быдлокодил и пришла в голову дурацкая мысль.
     
  2. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    Что значит «вхолостую»? Кто там работает? А в принципе: continue;
     
  3. Benjamin

    Benjamin Активный пользователь

    С нами с:
    23 янв 2009
    Сообщения:
    154
    Симпатии:
    0
    Адрес:
    Тула
    break заканчивает выполнение текущей структуры (цикла) for, foreach, while, do..while или switch.

    break принимает необязательный числовой аргумент, указывающий, сколько содержащих вкладывающих структур прерывают выполнение.

    Код (Text):
    1. $arr = array ('one', 'two', 'three', 'four', 'stop', 'five');
    2. while (list (, $val) = each ($arr)) {
    3.     if ($val == 'stop') {
    4.         break;    /* Вы можете также записать 'break 1;' */
    5.     }
    6.     echo "$val<br>\n";
    7. }
    8.  
    9. /* Использование необязательного аргумента. */
    10.  
    11. $i = 0;
    12. while (++$i) {
    13.     switch ($i) {
    14.     case 5:
    15.         echo "At 5<br>\n";
    16.         break 1;  /* Выход только из switch. */
    17.     case 10:
    18.         echo "At 10; quitting<br>\n";
    19.         break 2;  /* Выход из switch и из while. */
    20.     default:
    21.         break;
    22.     }
    23. }
     
  4. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    Benjamin это заканчивает только текущую итерацию и начинает следующую. А вопрос был в другом.

    akrinel
    PHP:
    1. <?php
    2. $stop=0;
    3. $items=array(1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1);
    4. for ($i=0;$i<count($items) && !$stop;$i++) {
    5. if ($i==5) $stop=1;
    6. echo '<br />'.$i;
    7. }
    8. echo ' '.$i;
    9. ?>
     
  5. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    О, пошел ртфм.
     
  6. akrinel

    akrinel Активный пользователь

    С нами с:
    26 янв 2009
    Сообщения:
    955
    Симпатии:
    1
    Адрес:
    Spb
    AlexGousev, Benjamin Вы меня не поняли.
    Я знаю и про break и про continue

    Имеется в виду:

    есть у нас N пунктов

    пункт 1
    пункт 2
    пункт 3
    пункт ...
    пункт N-2
    пункт N-1
    пункт N

    Если пункт 3 текущий и он у нас может быть только один, то получается остальные N-3 пункта, нам условие уже не нужно, ибо зачем сравнивать если текущий пункт мы уже нашли? Поэтому хочется что бы в дальнейшем цикл работал уже без условия.
     
  7. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    akrinel
    если сравнение сложное, то можно заменить его на if($found)
    иначе в обычном случае это даст 0.01% выигрыша.

    если код становится плохо читаем, то я выношу обработку в функцию.
     
  8. akrinel

    akrinel Активный пользователь

    С нами с:
    26 янв 2009
    Сообщения:
    955
    Симпатии:
    1
    Адрес:
    Spb
    armadillo, ну не совсем, то что хотелось бы, но вполне работает, что-то я торможу сегодня :)
     
  9. akrinel

    akrinel Активный пользователь

    С нами с:
    26 янв 2009
    Сообщения:
    955
    Симпатии:
    1
    Адрес:
    Spb
    Ну да я так и делаю. Я же говорю, просто возникла дурацкая мысль а-ля было бы круто если можно было бы "подменить" тело цилка на середине выполнения :)
     
  10. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    создай копию массива и сделай unset для лишнего айтема и получить всё остальное %)
     
  11. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    это не даст выигрыша в коде, потому что пока не нашел надо обрабатывать оба варианта.
     
  12. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    akrinel
    Фигней ты страдаешь, честное слово :)
     
  13. akrinel

    akrinel Активный пользователь

    С нами с:
    26 янв 2009
    Сообщения:
    955
    Симпатии:
    1
    Адрес:
    Spb
    AlexGousev