私は、学習の練習として、生成されたCSSを出力するCSSファイルとPHPファイルを結合して縮小する関数を作成しています。出力バッファリングを使用しているときに変数の競合を避ける方法
すべてがcssファイルをループしていますが、すぐに出力バッファから返された文字列をPHPファイルからプッシュしようとすると、配列はintになります。 var_dump()は次のようになります。
また、文字列を連結しようとしました。それはPHPファイルへのを得るまでには、その文字列の前のすべてがそうと同様に4となり、再び正常に動作します:
4/*
* Home: Appointment Grid
*/
.difAppointmentGrid {
margin: 2rem 0;
font-family: "Lato" !important;
box-shadow: -4px 4px 16px 4px hsla(240, 0%, 0%, 0.1);
}
. . .
これは私がstyles.phpファイルでやっているものの例である:
function styles_init()
{
$path = __DIR__ . '/aggregate.min.css';
if (is_writable($path))
{
$r = array();
foreach(array_filter(glob(__DIR__ . '/modules/*.*'), 'is_file') as $file)
{
$fn = pathinfo($file);
if ($fn['extension'] == 'php' || $fn['extension'] == 'css' )
{
ob_start();
include($file);
$x = ob_get_flush();
$r[] = $x;
}
}
$c = implode("\n\n", $r);
//$c = str_replace(array(' {', ': ', ', '), array('{', ':', ',') , str_replace(array("\r\n", "\r", "\n", "\t", ' ', ' ', ' '), '', preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $c)));
$f = fopen($path, 'wb');
fwrite($f, $c);
fclose($f);
}
}
奇妙な部分が連結/ array_pushing時にエラーが実際にスローされていないです:
. . .
.difAppointmentGrid header div h3 {
margin: 0;
padding: 1.5rem 0;
font-size: 2rem;
text-align: center;
color: white;
}
<?php
for ($h3 = 1, $o = 0.40; $h3 <= 4; ++$h3, $o += 0.20)
{
$rule = '.difAppointmentGrid header div:nth-child('.$h3.') h3 {'."\n\t".
'background-color: hsla(223, 63%, 22%, '.$o.');'."\n".
'}'."\n";
echo $rule;
}
?>
.dif_grid {
display: flex;
}
. . .
この 機能です。私は何がうまくいかないかを実際に理解することができないので、何を質問するのか正確にはわからない。また、ヘッダー、文字エンコーディング、さまざまなob関数、ob_get_flushを文字列にキャストして欲求不満から抜け出しました。
ソリューション:
function get_include_output($file)
{
ob_start();
include($file);
return ob_get_flush();
}
function styles_init()
{
$path = __DIR__ . '/aggregate.min.css';
if (is_writable($path))
{
$r = array();
foreach(array_filter(glob(__DIR__ . '/modules/*.*'), 'is_file') as $file)
{
$fn = pathinfo($file);
if ($fn['extension'] == 'php' || $fn['extension'] == 'css' )
{
$r[] = get_include_contents($file);
}
}
$c = implode("\n\n", $r);
//$c = str_replace(array(' {', ': ', ', '), array('{', ':', ',') , str_replace(array("\r\n", "\r", "\n", "\t", ' ', ' ', ' '), '', preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $c)));
$f = fopen($path, 'wb');
fwrite($f, $c);
fclose($f);
}
}
:
その後にコードを変更?また、 '$ r [] = $ x'はここで' array_push() 'を使うよりも優れています。 – GentlemanMax
@GentlemanMax私は$ r [count($ r)] = $ xでそれを試しました。それは同じ挙動をもたらした。私はちょうどvar_dump()とerror_log()を使用してループしながら値を取得しています。 私の疑念は、これが私が気づいていない出力バッファリングのいくつかの側面に由来しているということです。 – Taishi
'array_push()'の直後に 'var_dump($ r)'をしていても、 'count($ r)'ビットは必要ありませんか?あなたは 'ob_get_clean()'で試しましたか? – GentlemanMax