За последние 24 часа нас посетили 41027 программистов и 1813 роботов. Сейчас ищут 927 программистов ...

while foreach что во что

Тема в разделе "PHP для новичков", создана пользователем justc, 2 мар 2018.

  1. justc

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

    С нами с:
    27 сен 2015
    Сообщения:
    130
    Симпатии:
    0
    Чет мозги уже не соображают. Есть вот такой код (упростил, чтобы легче понять):

    Код (Text):
    1.  
    2. $arr = ['1','2','3'];
    3.  
    4. while ($z1->next())
    5. {
    6.  
    7. foreach ($arr as $arrone) {
    8.  
    9. $r[] = $arrone.'-'.$z1->id;
    10.  
    11. }
    12.  
    13. }
    Не знаю как правильно объяснить, но надеюсь будет понятно.

    делаю sql запрос ($z1) где по условию ищется id нужных мне записей

    пока есть записи (while ($z1->next()))
    то делаем foreach и тд


    собственно вопрос:
    может логичнее сначала foreach, а внутри while ?
    или вообще без разницы?


    не пойму правильно ли я сделал в смысле логики
     
  2. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.817
    Симпатии:
    1.333
    Адрес:
    Лень
    что ты вообще делаешь ? разбираешь одни данные, а трогаешь другие
     
  3. justc

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

    С нами с:
    27 сен 2015
    Сообщения:
    130
    Симпатии:
    0
    сложно объяснить

    нужно добавить в таблицу categories записи с news_id и category_id
    для определенных записей в таблице news (ну например у который tstamp = time())

    Код (Text):
    1. INSERT INTO categories (category_id, news_id) VALUES (".$arrone.", ".$z1->id.")
    да дело не в этом, я хочу знать, что будет логически правильным

    while () { foreach() {} }
    или
    foreach () { while () {} }
    --- Добавлено ---
    ну например 10 новостей по 2 категории в каждой

    мне нужно сделать 20 записей в таблицу categories
    где будет

    category_id | news_id
    1 | 1
    2 | 1
    1 | 2
    2 | 2

    ...
    --- Добавлено ---
    то есть $arr это массив с id категорий
    $z1 тут выборка всех новостей по условию (SELECT id FROM news WHERE...)
    --- Добавлено ---
    блин, наверно нереально со стороны понять что тут к чему)) сорри....
     
  4. justc

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

    С нами с:
    27 сен 2015
    Сообщения:
    130
    Симпатии:
    0
    Просто ответьте, пожалуйста, на этот вопрос:

    Как работает конструкция while () { foreach() {} } ?

    Сначала, в первом витке цикла while полностью выполняется цикл foreach ?
    как только полностью выполнится foreach пойдет второй виток цикла while ?
    и снова полностью выполнится foreach

    я правильно понимаю?
     
  5. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Логично
     
  6. justc

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

    С нами с:
    27 сен 2015
    Сообщения:
    130
    Симпатии:
    0
    @mkramer, ok, спасибо, у меня просто мозги уже не соображают, нужно было чтоб кто-то подтвердил))

    я так понимаю, если наоборот, то не прокатит? foreach () { while () {} }

    логика уже ломается?
     
  7. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.593
    Симпатии:
    362
    Логика остается в добром здравии.
    Для каждого элемента массива, для которого выполняется перебор foreach() будет выполняться блок while()
    --- Добавлено ---
    Другой вопрос: "Что происходит с данными?"...
     
  8. justc

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

    С нами с:
    27 сен 2015
    Сообщения:
    130
    Симпатии:
    0
    @Sail, всё понял, да, получится наоборот, мне нужно чтобы для каждого while выполнялся foreach, а не наоборот
     
  9. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    если ты хочешь, чтобы сначала была единичка, потом все айдишники z1, а потом двоечка, и снова все айдишники z1 - то да
    если ты хочешь чтобы на каждый айдишник z1 шли все 1 и 2 и 3, то как у тебя.
     
  10. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Конечно снаружи должен быть while, потому что он выполнится один раз и всё, eof. А foreach можно сколько угодно раз гонять.
     
  11. Sergey_Tsarev

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

    С нами с:
    17 мар 2016
    Сообщения:
    502
    Симпатии:
    105
    блин :) лучше опиши что ты хочешь сделать сначала))
     
  12. justc

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

    С нами с:
    27 сен 2015
    Сообщения:
    130
    Симпатии:
    0
    @igordata, вот даже сейчас на свежую голову мне кажется это одним и тем же...
    и так и так будет по 20 записей, разве нет? (2 категории 10 новостей)

    while () { foreach() {} }

    category_id | news_id
    1 | 1
    2 | 1
    1 | 2
    2 | 2

    foreach () { while () {} }

    category_id | news_id
    1 | 1
    1 | 2
    2 | 1
    2 | 2


    в итоге тоже самое?)))
    --- Добавлено ---
    @[vs],
    немного не пойму

    первый цикл foreach в нем выполняется полностью while, так?
    потом второй цикл foreach и снова полностью выполняется цикл while

    ?
     
  13. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    они в разной последовательности идут. это не то же самое. :D
     
  14. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    @justc нет, while не может выполниться снова.
     
  15. justc

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

    С нами с:
    27 сен 2015
    Сообщения:
    130
    Симпатии:
    0
    @[vs]
    а где почитать про это?
     
  16. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    А по моему все не логично. Запрос должен быть один а на счет while и foreach а почему for обделили? Или почему не 2 foreach?
     
  17. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    @justc в словаре
    слово next что означает?
     
  18. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ну это частности. можно же результаты скопить в массив и выводить потом шо так шо этак
     
  19. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Да нн в конкретном коде ТС работает с итератором, который дойдёт до конца и всё.
     
  20. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ну можно посоветовать ТСу скопить всё в массив и всё =) решена задачка - выводи хоть вдоль, хоть поперёк