За последние 24 часа нас посетили 51716 программистов и 1761 робот. Сейчас ищет 821 программист ...

Чем заменить foreach?

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

  1. gw1516

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

    С нами с:
    4 май 2017
    Сообщения:
    29
    Симпатии:
    0
    Здравствуйте! Есть такая конструкция, используемая для сравнения товаров. Первый столбец - это названия характеристик товара, остальные столбцы - это их значения. Таких характеристик очень много, можно ли как-то облегчить код, или заменить кучу дублирующихся foreach одним? Никак не соображу, как это можно сделать...

    PHP:
    1. $arr = select from table и т.д....
    2. <table>
    3. <tr>
    4. <td>Цвет</td>
    5. <? foreach ($arr as $val) { echo '<td>'.$val['color'].'</td>';}?>
    6. </tr>
    7.  
    8. <tr>
    9. <td>Количество</td>
    10. <? foreach ($arr as $val) { echo '<td>'.$val['count'].'</td>';}?>
    11. </tr>
    12.  
    13. <tr>
    14. <td>Размер</td>
    15. <? foreach ($arr as $val) { echo '<td>'.$val['size'].'</td>';}?>
    16. </tr>
    17. ...
    18. </table>
     
  2. Sergey_Tsarev

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

    С нами с:
    17 мар 2016
    Сообщения:
    502
    Симпатии:
    105
    PHP:
    1. foreach($arr as $key => $value) {
    2. echo '<td>'.$key.'</td><td>'.$value.'</td>';
    3. }
     
  3. yanuzay

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

    С нами с:
    28 мар 2018
    Сообщения:
    503
    Симпатии:
    58
    Например оставить один цикл, а результаты записывать в переменную:
    PHP:
    1. $arr = select from table и т.д....
    2. <?
    3.   $size='';
    4.   $color='';
    5.   $count='';
    6.   foreach ($arr as $val) {
    7.      $size .= '<td>'.$val['size'].'</td>';
    8.      $color .= '<td>'.$val['color'].'</td>';
    9.      $count .= '<td>'.$val['count'].'</td>';
    10.   }
    11. ?>
    12. <table>
    13. <tr>
    14. <td>Цвет</td>
    15. <? echo $color; ?>
    16. </tr>
    17.  
    18. <tr>
    19. <td>Количество</td>
    20. <? echo $count; ?>
    21. </tr>
    22.  
    23. <tr>
    24. <td>Размер</td>
    25. <? echo $size; ?>
    26. </tr>
    27. ...
    28. </table>
     
    gw1516 нравится это.
  4. gw1516

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

    С нами с:
    4 май 2017
    Сообщения:
    29
    Симпатии:
    0
    Что это даст? Зачем?
     
  5. Artur_hopf

    Artur_hopf Старожил

    С нами с:
    7 май 2018
    Сообщения:
    2.264
    Симпатии:
    405
    Я так делаю:
    PHP:
    1. function createTable(){
    2. //$arr = select from table и т.д....
    3. $result = "";
    4.  
    5. $result .= '<thead>
    6.   <tr>
    7.     <th>Цвет</th>
    8.     <th>Количество</th>
    9.     <th>Размер</th>
    10.    </tr>
    11.  </thead>
    12. <tbody>';
    13.  
    14.   foreach ($arr as $val){
    15.      $result .= '<tr>'
    16.         .'<td>'.$val['color'].'</td>'
    17.         .'<td>'.$val['count'].'</td>'
    18.         .'<td>'.$val['size'].'</td>'
    19.       .'</tr>';
    20.    }
    21.    $result .= '</tbody>';
    22.  
    23.    return $result;
    24. }
     
  6. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.816
    Симпатии:
    1.332
    Адрес:
    Лень
    @yanuzay
    PHP:
    1. $size = $color = $count = '';
     
  7. roswww

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

    С нами с:
    15 окт 2016
    Сообщения:
    154
    Симпатии:
    4
    Адрес:
    Cтаврополь
    Можно заменить foreach,- другим циклом: while, for, do-while.
     
  8. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.816
    Симпатии:
    1.332
    Адрес:
    Лень
    @roswww for and do while не пойдут
     
    gw1516 нравится это.
  9. gw1516

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

    С нами с:
    4 май 2017
    Сообщения:
    29
    Симпатии:
    0
    Спасибо!
    Cпасибо, но не совсем то. Цвет, количество и размер - это строки первого столбца, а не заголовки столбцов
     
    #9 gw1516, 20 дек 2018
    Последнее редактирование: 20 дек 2018
  10. AlexandrS

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

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
    То что написал Artur_hopf это как вариант, т.е. ты можешь написать собственную функцию.
    Примерно так:
    PHP:
    1. function($arrParams, $arrData){}
    В которой:
    PHP:
    1. $arrParams = array('color' => 'Цвет', 'count' => 'Количество',  'size' => 'Размер');
    2. $arrData = (/*$arr = select from table*/)
    В теле функции у тебя будет 2 foreach. первый будет проходиться по $arrParams и формировать
    HTML:
    1. <td>Количество</td>
    Второй вложенный в первый и будет делатьто, что далает сейчас:
    PHP:
    1. <? foreach ($arr as $val) { echo '<td>'.$val['size'].'</td>';}?>
    Начала и конец тела функции обрамляешь
    HTML:
    --- Добавлено ---
    Тут просто возникает вопрос, у тебя :
    PHP:
    1. $val['color']
    у тебя имеет одинаковый ключ, а значит из массива будет вытаскиваться одно и тоже значение по этому ключу. Отсюда был вполне логичный ответ с echo
     
    gw1516 нравится это.
  11. Artur_hopf

    Artur_hopf Старожил

    С нами с:
    7 май 2018
    Сообщения:
    2.264
    Симпатии:
    405
    @gw1516 держи, проще уже некуда:
    PHP:
    1. $arrParams = ['color' => 'Цвет', 'count' => 'Количество', 'size' =>'Размер'];
    2. $array =  [0 =>['color' => 'зеленый', 'count' => '1',  'size' => '10'],
    3.            1 =>['color' => 'красный', 'count' => '2',  'size' => '3']];
    4.  
    5. $result = '<table>';
    6.  
    7. foreach ($arrParams as $key => $value) {
    8.     $result .= '<tr>'
    9.     .'<td>'.$value.'</td>';
    10.    
    11.     foreach ($array as $val) {
    12.         $result .=  '<td>'.$val[$key].'</td>';
    13.     }
    14. }
    15. $result .='</tr></table>';
    16. echo $result;
    Главное чтоб ключи у твоего массива совпадали с ключами которые ты создашь для параметров.
     
    gw1516 нравится это.
  12. gw1516

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

    С нами с:
    4 май 2017
    Сообщения:
    29
    Симпатии:
    0
    Спасибо большое! это то, что нужно
     
  13. gw1516

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

    С нами с:
    4 май 2017
    Сообщения:
    29
    Симпатии:
    0
    $result .= '<tr>'.'<td>'.$value.'</td>';
    Объясните пожалуйста, для чего нужен выделенный фиолетовым цветом участок кода? Почему не просто <tr><td>'.$value.'</td>? Что дает эта точка? Не совсем понял этот момент
     
  14. Artur_hopf

    Artur_hopf Старожил

    С нами с:
    7 май 2018
    Сообщения:
    2.264
    Симпатии:
    405
    @gw1516 мне просто удобнее свой код так читать =)
    Структура потому что в html должна быть такая:
    HTML:
    1.  
    2.      <tr>
    3.           <td>
    4.                  Текст
    5.           </td>
    6.      </tr>
    7.  
    я стараюсь в php такие вещи с новой строки писать.
     
    gw1516 нравится это.
  15. Sergey_Tsarev

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

    С нами с:
    17 мар 2016
    Сообщения:
    502
    Симпатии:
    105
    Да, это я невнимательно прочитал и написал бредятину)))
    Можно так:
    PHP:
    1. $result = ['<table><tr>','color' => '<td>Цвет</td>','</tr><tr>','count' => '<td>Количество</td>','</tr><tr>','size' => '<td>Размер</td>','</tr></table>'];
    2. foreach($arr as $value) {
    3.     $result['color'] .= '<td>'.$value['color'].'</td>';
    4.     $result['count'] .= '<td>'.$value['count'].'</td>';
    5.     $result['size'] .= '<td>'.$value['size'].'</td>';
    6. }
    7.  
    8. echo implode($result);
    Или так:
    PHP:
    1. $format = '<table><tr><td>Цвет</td>%s</tr><tr><td>Количество</td>%s</tr><tr><td>Размер</td>%s</tr></table>';
    2. $result = [];
    3.  
    4. foreach($arr as $value) {
    5.     $result['color'] .= '<td>'.$value['color'].'</td>';
    6.     $result['count'] .= '<td>'.$value['count'].'</td>';
    7.     $result['size'] .= '<td>'.$value['size'].'</td>';
    8. }
    9.  
    10. echo sprintf($format, $result['color'], $result['count'], $result['size']);
     
    #15 Sergey_Tsarev, 21 дек 2018
    Последнее редактирование: 21 дек 2018
    gw1516 нравится это.
  16. AlexandrS

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

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
    При добавлении нового значения придется переписывать весь код.
    К примеру (на основе того когда который написал Artur_hopf) я дернул из базы и получил 2 массива, сравнил их по длине параметров если в первом и втором count() не равны
    PHP:
    1. if( count($arrParams) !== count($array[0]) )  /* сообщаем об этом или выводим пустую таблицу */
    т.е. я оперирую только получаемыми данными, а у тебя получается нужно лезть в код и править его полностью. А если таких параметров будет 20-30. Это сегодня заказчику нужно 3 параметра, а завтра 5, после завтра еще 7 и т.д. :)
     
    gw1516 нравится это.
  17. Sergey_Tsarev

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

    С нами с:
    17 мар 2016
    Сообщения:
    502
    Симпатии:
    105
    Ну это пример. Но тебе в любом случае нужно будет лезть в код и прописывать название параметров, например.
     
  18. AlexandrS

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

    С нами с:
    30 сен 2017
    Сообщения:
    659
    Симпатии:
    103
    Адрес:
    Краснодар
    Ну если только как пример.
    Зачем? Если к примеру у меня БД в которой уже есть данные и в ней будут прописаны:
    PHP:
    1. 'color'=>'Цвет','count'=>'Количество','size'=>'Размер'
    если нужно что-то расширить, то просто в БД добавится графы
    PHP:
    1. 'price' => 'цена', 'weight' => 'вес'
    и добавить таблицу в БД с значениями цены и веса. Затем просто отдать скрипту полученные из БД массивы.
    Ну или просто даже без БД, сами массивы с данными можно вынести в отдельный файл и работать с ними там.
     
    gw1516 нравится это.