есть ли способ управлять foreach?

Discussion in 'PHP' started by Дикс, 1 Mar 2010.

  1. Дикс

    Дикс Elder - Старейшина

    Joined:
    16 Apr 2006
    Messages:
    1,194
    Likes Received:
    227
    Reputations:
    26
    думал спросить в теме для новичков, но потом решил что этот вопрос не относится к основам и может быть интересен не только мне.

    интересно, есть ли способ управлять foreach?
    в частности - при определенном условии вернуть его на предыдущую позицию

    т.е. к примеру

    foreach($keys as $key)
    {

    echo $key;
    if($key == ...)
    prev($key); // не работает
    }

    суть в том, чтобы в следующей итерации снова повторился текущий ключ


    PS я знаю про for(), хочется обойтись без него
     
  2. Kaimi

    Kaimi Well-Known Member

    Joined:
    23 Aug 2007
    Messages:
    1,732
    Likes Received:
    809
    Reputations:
    231
    Почему?
    Воспользуйся while тогда)
     
    _________________________
  3. oRb

    oRb Elder - Старейшина

    Joined:
    9 May 2008
    Messages:
    294
    Likes Received:
    581
    Reputations:
    256
    http://ru2.php.net/manual/en/control-structures.foreach.php
    Поэтому:
    PHP:
    $keys range(15);
    while(list(
    $value$key) = each($keys)) {
        if(
    $key == 3)
            
    next($keys);

        echo 
    $key "\n";
    }
    Результат:
    Code:
    1
    2
    3
    5
    
     
    1 person likes this.
  4. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    если я правильно понял ТС:

    PHP:
    <?php 
    $array 
    range(1,5);
    $flag true;
    while(
    $current current($array)) {
          echo 
    $current "<br>";
          
    next($array);
          if (
    $current == && $flag) {
               
    prev($array);
               
    $flag false;
          }
    }
    ?>
    Результат:
    Code:
    1
    2
    2
    3
    4
    5
    
     
    1 person likes this.
  5. Дикс

    Дикс Elder - Старейшина

    Joined:
    16 Apr 2006
    Messages:
    1,194
    Likes Received:
    227
    Reputations:
    26
    ну да, в целом реализация позволяет добиться того что нужно

    но тут надо сказать, почему я не хочу использовать for, в котором достаточно написать $i--

    PHP:
    $keys = ...
    $size sizeof($keys);
    for(
    $i 0$i $size$i++)
    {

    $key $keys[$i];
    echo 
    $key;

    }
    а в случае с foreach()

    PHP:
    $keys = ...
    foreach(
    $keys as $key)
    {

    echo 
    $key;

    }
    не хватает лишь возможности открутить его обратно при условии

    я знаю что фореач это копия, узрел как-то в учебнике по плюсам
    но это нисколько не оправдывает отсутствие такой возможности

    ну и вариант с each() ещё более ужасен в плане красоты кода


    судя по всему простого решения нет, поэтому всем спасибо, не заморачивайтесь над этим. просто у меня такие вот нездоровые стремления :)
     
  6. dr.Web

    dr.Web Member

    Joined:
    2 Feb 2009
    Messages:
    7
    Likes Received:
    22
    Reputations:
    10
    PHP:
    next() prev() current()
     
  7. criptic

    criptic Member

    Joined:
    24 Mar 2009
    Messages:
    51
    Likes Received:
    5
    Reputations:
    0
    оператор foreaM ты гарантированно получишь каждый элемент, поскольку не потребуется вручную устанавливать цикл и запрашивать счетчик, а оператор, содержащийся в цикле, автоматически поместит элемент в указанную тобой переменную — достаточно лишь сослаться на нее в этом операторе.
     
  8. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    какие мы умные, а теперь прочитайте первый пост темы
     
  9. criptic

    criptic Member

    Joined:
    24 Mar 2009
    Messages:
    51
    Likes Received:
    5
    Reputations:
    0
    Оу, сори
     
  10. dr.Web

    dr.Web Member

    Joined:
    2 Feb 2009
    Messages:
    7
    Likes Received:
    22
    Reputations:
    10
    PHP:

    foreach($keys as $i=>$key)
    {

    echo 
    $key;
    if(
    $key == ...)
    $keys[$i-1];
    }

     
  11. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    а теперь запусти свой скрипт и перечитай первый пост снова
     
    #11 Pashkela, 2 Mar 2010
    Last edited: 2 Mar 2010
  12. shellz[21h]

    shellz[21h] Elder - Старейшина

    Joined:
    20 Dec 2007
    Messages:
    311
    Likes Received:
    68
    Reputations:
    6
    Используй do {....} while(....);
    типа гламурный кодер))
     
    #12 shellz[21h], 2 Mar 2010
    Last edited: 2 Mar 2010
  13. dr.Web

    dr.Web Member

    Joined:
    2 Feb 2009
    Messages:
    7
    Likes Received:
    22
    Reputations:
    10

    что не так?


    PHP:

     
    foreach($keys as $i=>$key


    echo 
    $key//показыввает текущий элемент
    if($key == ...) //если $key == ...  то
    $keys[$i-1]; //показывает предыдущий элемент



     
    #13 dr.Web, 3 Mar 2010
    Last edited: 3 Mar 2010
  14. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    уже писал - запусти скрипт, проверь, предварительно прочитай первый пост, не выставляй себя идиотом
     
  15. dr.Web

    dr.Web Member

    Joined:
    2 Feb 2009
    Messages:
    7
    Likes Received:
    22
    Reputations:
    10
    идиотом себя выставляешь ты я и без запуска знаю что получиться.

    //непонял наверное первый пост...
     
    #15 dr.Web, 3 Mar 2010
    Last edited: 3 Mar 2010
  16. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    Ок, покажи пример скрипта на основании своего алгоритма, отвечающего условиям, озвученным в первом посте, чтобы смыть с себя все то заслуженное говно, которым я тебя заслуженно облил.
     
  17. dr.Web

    dr.Web Member

    Joined:
    2 Feb 2009
    Messages:
    7
    Likes Received:
    22
    Reputations:
    10
    на

    PHP:

    $keys
    =range(1,100);


    foreach(
    $keys as $i=>$key)  
    {  

    echo 
    $key."<br>";
    if(
    $key == 20){echo $keys[$i]."<br>";}



    exit;


    обливатель. ;)


    Code:
    
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    
    
     
    #17 dr.Web, 3 Mar 2010
    Last edited: 3 Mar 2010
  18. dr.Web

    dr.Web Member

    Joined:
    2 Feb 2009
    Messages:
    7
    Likes Received:
    22
    Reputations:
    10
    можно ввести ещё одну переменную в которой будет храниться нужный индекс массива.
     
  19. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    молодец, а говорил не знаешь

    а теперь представь, что не на предыдущую, а на две-двадцать назад, и ключи у массива не идут так - 1,2,3,4,5,6, а, например, так - 1,11,34,45,67,89,90

    PS: И потом ты не вернул на предыдущую позицию, а просто повторил два раза текущую, разницу чуствуешь?
     
    #19 Pashkela, 3 Mar 2010
    Last edited: 3 Mar 2010
  20. dr.Web

    dr.Web Member

    Joined:
    2 Feb 2009
    Messages:
    7
    Likes Received:
    22
    Reputations:
    10
    тогда while :p