За последние 24 часа нас посетил 22961 программист и 1267 роботов. Сейчас ищут 779 программистов ...

Избежать повторного вызова foreach (ob)

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

Метки:
  1. Razorfen

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

    С нами с:
    2 авг 2016
    Сообщения:
    40
    Симпатии:
    0
    Как можно сократить этот код, использующий функции контроля вывода (ob)? Возможно избежать повторного вызова foreach?
    http://sandbox.onlinephpfunctions.com/code/e0e1ba04da412aef7a7b84fe3176eb2e3e8066f1
    PHP:
    1. <?php
    2. $codes = array('F_NAME', 'F_PHONE', 'F_EMAIL', 'F_ADDRESS');
    3.  
    4. echo "#F_NAME#";
    5. echo "#F_PHONE#";
    6. $props = ob_get_contents();
    7.  
    8. foreach ($codes as $code)
    9. {
    10.     switch ($code)
    11.     {
    12.         case "F_NAME":
    13.             $str = 0;
    14.             break;
    15.         case "F_PHONE":
    16.             $str = 1;
    17.             break;
    18.     }
    19.  
    20. $props = str_replace(
    21.         '#'.$code.'#',
    22.         $str,
    23.         $props);
    24. }
    25.  
    26. echo $props."\n";
    27.  
    28. echo "#F_EMAIL#";
    29. echo "#F_ADDRESS#";
    30. $props = ob_get_contents();
    31.  
    32. foreach ($codes as $code)
    33. {
    34.     switch ($code)
    35.     {
    36.         case "F_EMAIL":
    37.             $str = 2;
    38.             break;
    39.         case "F_ADDRESS":
    40.             $str = 3;
    41.             break;
    42.     }
    43.  
    44. $props = str_replace(
    45.         '#'.$code.'#',
    46.         $str,
    47.         $props);
    48. }
    49.  
    50. echo $props."\n";
     
  2. villiwalla

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

    С нами с:
    14 дек 2016
    Сообщения:
    471
    Симпатии:
    70
    А сам дубля не видеть? У тебя все есть в первой же строке.
     
    _ne_scaju_ нравится это.
  3. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Сократил, без одной копии:
    PHP:
    1. <?php
    2. $codes = array('F_NAME', 'F_PHONE', 'F_EMAIL', 'F_ADDRESS');
    3. echo "#F_NAME#";
    4. echo "#F_PHONE#";
    5. $props = ob_get_contents();
    6. foreach ($codes as $code)
    7. {
    8.     switch ($code)
    9.     {
    10.         case "F_NAME":
    11.             $str = 0;
    12.             break;
    13.         case "F_PHONE":
    14.             $str = 1;
    15.             break;
    16.     }
    17. $props = str_replace(
    18.         '#'.$code.'#',
    19.         $str,
    20.         $props);
    21. }
    22. echo $props."\n";
    если тяжело держи, без дубля.
     
  4. Razorfen

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

    С нами с:
    2 авг 2016
    Сообщения:
    40
    Симпатии:
    0
    PHP:
    1. echo "#F_EMAIL#";
    2. echo "#F_ADDRESS#";
    и
    PHP:
    1. echo "#F_NAME#";
    2. echo "#F_PHONE#";
    Вызываются в разных функциях
     
  5. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    тогда так:
    PHP:
    1. <?php
    2. $codes = array('F_NAME', 'F_PHONE', 'F_EMAIL', 'F_ADDRESS');
    3. echo "#F_NAME#";
    4. echo "#F_PHONE#";
    5. echo "#F_EMAIL#";
    6. echo "#F_ADDRESS#";
    7. $props = ob_get_contents();
    8. foreach ($codes as $code)
    9. {
    10.     switch ($code)
    11.     {
    12.         case "F_NAME":
    13.             $str = 0;
    14.             break;
    15.         case "F_PHONE":
    16.             $str = 1;
    17.             break;
    18.         case "F_EMAIL":
    19.             $str = 2;
    20.             break;
    21.         case "F_ADDRESS":
    22.             $str = 3;
    23.             break;
    24.     }
    25. $props = str_replace(
    26.         '#'.$code.'#',
    27.         $str,
    28.         $props);
    29. }
     
  6. Razorfen

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

    С нами с:
    2 авг 2016
    Сообщения:
    40
    Симпатии:
    0
    Я кастомизирую шаблон компонента "sale.order.ajax" Битрикса. Сделать так - невозможно. Условимся, что в этом примере невозможно изменить положение вызова echo.
     
  7. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    тогда уже не знаю, программеры со стажем помогут.
     
  8. Razorfen

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

    С нами с:
    2 авг 2016
    Сообщения:
    40
    Симпатии:
    0
    Решил вопрос глобальной переменной.
     
  9. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    говорят, что глобальные переменные не всегда хорошо.
     
    MouseZver нравится это.
  10. Razorfen

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

    С нами с:
    2 авг 2016
    Сообщения:
    40
    Симпатии:
    0
    Интересно было бы послушать мнение о том, что лучше: такое дублирование кода или глобальная переменная.
     
  11. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    лучше глобальная будет, зачем дублировать код, те же записывать значение, каждая переменная занимает некую часть памяти, представь что ты будешь дублировать код везде и сколько памяти понадобиться чтобы все твои дубляжи работали.
    Глобальная переменная ты ее создаешь глобально - то-есть она будет видна везде, к ней можно обратиться вроде из любого файла .php
    https://php.ru/manual/language.variables.scope.html
    почитай.
     
    #11 _ne_scaju_, 24 авг 2018
    Последнее редактирование: 25 авг 2018
  12. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.751
    Симпатии:
    1.322
    Адрес:
    Лень
    Не то и не другое, а третий: изменить логику кода.
    PHP:
    1. <?php
    2.  
    3. error_reporting ( E_ALL );
    4.  
    5. $tags = array_flip ( [ '#F_NAME#', '#F_PHONE#', '#F_EMAIL#', '#F_ADDRESS#' ] );
    6.  
    7. ob_start ( function ( $content ) use ( $tags )
    8. {
    9.     return strtr ( $content, $tags );
    10. } );
    11.  
    12. echo "#F_NAME#", "#F_PHONE#", "#F_EMAIL#", "#F_ADDRESS#";
    13.  
     
    #12 MouseZver, 25 авг 2018
    Последнее редактирование: 25 авг 2018
    _ne_scaju_ и Razorfen нравится это.
  13. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    С
    Сказал же помогут программеры со стажем)