Как можно сократить этот код, использующий функции контроля вывода (ob)? Возможно избежать повторного вызова foreach? http://sandbox.onlinephpfunctions.com/code/e0e1ba04da412aef7a7b84fe3176eb2e3e8066f1 PHP: <?php $codes = array('F_NAME', 'F_PHONE', 'F_EMAIL', 'F_ADDRESS'); ob_start(); echo "#F_NAME#"; echo "#F_PHONE#"; $props = ob_get_contents(); ob_end_clean(); foreach ($codes as $code) { switch ($code) { case "F_NAME": $str = 0; break; case "F_PHONE": $str = 1; break; } $props = str_replace( '#'.$code.'#', $str, $props); } echo $props."\n"; ob_start(); echo "#F_EMAIL#"; echo "#F_ADDRESS#"; $props = ob_get_contents(); ob_end_clean(); foreach ($codes as $code) { switch ($code) { case "F_EMAIL": $str = 2; break; case "F_ADDRESS": $str = 3; break; } $props = str_replace( '#'.$code.'#', $str, $props); } echo $props."\n";
Сократил, без одной копии: PHP: <?php $codes = array('F_NAME', 'F_PHONE', 'F_EMAIL', 'F_ADDRESS'); ob_start(); echo "#F_NAME#"; echo "#F_PHONE#"; $props = ob_get_contents(); ob_end_clean(); foreach ($codes as $code) { switch ($code) { case "F_NAME": $str = 0; break; case "F_PHONE": $str = 1; break; } $props = str_replace( '#'.$code.'#', $str, $props); } echo $props."\n"; если тяжело держи, без дубля.
PHP: echo "#F_EMAIL#"; echo "#F_ADDRESS#"; и PHP: echo "#F_NAME#"; echo "#F_PHONE#"; Вызываются в разных функциях
тогда так: PHP: <?php $codes = array('F_NAME', 'F_PHONE', 'F_EMAIL', 'F_ADDRESS'); ob_start(); echo "#F_NAME#"; echo "#F_PHONE#"; echo "#F_EMAIL#"; echo "#F_ADDRESS#"; $props = ob_get_contents(); ob_end_clean(); foreach ($codes as $code) { switch ($code) { case "F_NAME": $str = 0; break; case "F_PHONE": $str = 1; break; case "F_EMAIL": $str = 2; break; case "F_ADDRESS": $str = 3; break; } $props = str_replace( '#'.$code.'#', $str, $props); }
Я кастомизирую шаблон компонента "sale.order.ajax" Битрикса. Сделать так - невозможно. Условимся, что в этом примере невозможно изменить положение вызова echo.
Интересно было бы послушать мнение о том, что лучше: такое дублирование кода или глобальная переменная.
лучше глобальная будет, зачем дублировать код, те же записывать значение, каждая переменная занимает некую часть памяти, представь что ты будешь дублировать код везде и сколько памяти понадобиться чтобы все твои дубляжи работали. Глобальная переменная ты ее создаешь глобально - то-есть она будет видна везде, к ней можно обратиться вроде из любого файла .php https://php.ru/manual/language.variables.scope.html почитай.
Не то и не другое, а третий: изменить логику кода. PHP: <?php error_reporting ( E_ALL ); $tags = array_flip ( [ '#F_NAME#', '#F_PHONE#', '#F_EMAIL#', '#F_ADDRESS#' ] ); ob_start ( function ( $content ) use ( $tags ) { return strtr ( $content, $tags ); } ); echo "#F_NAME#", "#F_PHONE#", "#F_EMAIL#", "#F_ADDRESS#"; ob_end_flush ();