2017-09-21 25 views
0

php-timeに基づいて正しいグラデーションの色を表示しようとしています。私が試してみると、グラデーションのミスマッチ(I.E.のトップカラーが最初の1時間チャンクと4時間チャンクのボトムカラーが一致します)。PHPの時間ベースのグラデーションの背景

あなたは括弧内の各 if条件の後のステートメントをラップする必要が
<?php 
$time = date("H"); 
if($time >= 06 && $time < 12) 
$topcolor = 'black'; 
$bottomcolor = 'orange'; 
if($time >= 12 && $time < 18) 
$topcolor = 'pink'; 
$bottomcolor = 'purple'; 
if($time >= 18 && $time < 24) 
$topcolor = 'yellow'; 
$bottomcolor = 'blue'; 
if($time >= 24 && $time < 6) 
$topcolor = 'red'; 
$bottomcolor = 'green'; 
?> 

<style> 
body { 
background: <?php echo $bottomcolor;?>; 
background: -webkit-linear-gradient(<?php echo $topcolor;?>, <?php echo $bottomcolor;?>) <?php echo $bottomcolor;?>; 
background: -o-linear-gradient(<?php echo $topcolor;?>, <?php echo $bottomcolor;?>) <?php echo $bottomcolor;?>; 
background: -moz-linear-gradient(<?php echo $topcolor;?>, <?php echo $bottomcolor;?>) <?php echo $bottomcolor;?>; 
background: linear-gradient(<?php echo $topcolor;?>, <?php echo $bottomcolor;?>) <?php echo $bottomcolor;?>; 
background-repeat: no-repeat; 
} 
</style> 
+1

があなたの状態のブロックを含むように*。 'if(...){code}'。また、else ifを使うことについて考えるべきです。 – Devon

+0

あなたはいくつかの問題を抱えています.6未満で24より大きいものはありません。 '06 == 6 'の間は、' 016 == 14 'なので整数に0を接頭する習慣に入るべきではありません。 0の接頭辞を付けるときは8進数を使用しています。 – Devon

+0

06から6に変更し、最後の24を0に変更しました。また、各条件に括弧を追加しました。これらの変更でコードが正常に動作すると思いますか?私は<24 to > = 0からの切り替えを心配しています---バックグラウンドスイッチは見えませんか? – Qwerty

答えて

1

if($time >= 06 && $time < 12) 
$topcolor = 'black'; 
$bottomcolor = 'orange'; 

- >

if($time >= 06 && $time < 12) { 
    $topcolor = 'black'; 
    $bottomcolor = 'orange'; 
} 

あなたはこれらを省略した場合、最初のステートメントが評価されます。 http://php.net/manual/en/control-structures.if.php

最後に$bottomcolorが有効になる理由は、$timeの値にかかわらず、その変数へのすべての割り当てが実行されており、最後の変数が優先されているためです。

0

あなたはifの文がどのように見えるdocumentationから学ぶことができたよう:

if (expression) 
    statement 

statements:文が代入、関数コール、ループ、条件を付けることができ

(何もしない)文(空の文)であってもよい。文は通常、セミコロンで終わります。さらに、ステートメントグループをステートメントグループにグループ化するには、中括弧でステートメントグループをカプセル化します。ステートメントグループは、ステートメント自体でもあります。

は我々だけだ新しい知恵によると、あなたのコードは、これと同じである(とインデントは、それが唯一の美しさのためにそこにある問題ではありません):

$time = date("H"); 
if ($time >= 06 && $time < 12) 
    $topcolor = 'black'; 
$bottomcolor = 'orange'; 
if ($time >= 12 && $time < 18) 
    $topcolor = 'pink'; 
$bottomcolor = 'purple'; 
if ($time >= 18 && $time < 24) 
    $topcolor = 'yellow'; 
$bottomcolor = 'blue'; 
if ($time >= 24 && $time < 6)   // <--- this condition is impossible 
    $topcolor = 'red'; 
$bottomcolor = 'green'; 

あなたが見ることができるように$timeの値にかかわらず、$bottomcolorの値は'orange'に変更され、次に'purple'に変更され、最終値は最後の割り当てによって生成される値($bottomcolor = 'green';)に変更されます。

それは彼らが唯一の文が含まれている場合でも、常にifelseelseif/elsewhiledo-whileforforeachcontrol structuresのステートメントのブロックを使用することrecommendedです。このようにして、プログラマがコードを読みやすく理解することができます。コンパイラには何の違いもありません。

戻るあなたのコードを、あなたはelseifステートメント使用してテストを簡素化することができます:あなたは括弧を使用する必要が

$time = date('H'); 

if ($time < 6) { 
    // night 
    $topcolor = 'red'; 
    $bottomcolor = 'green'; 
} elseif ($time < 12) { 
    // morning 
    $topcolor = 'black'; 
    $bottomcolor = 'orange'; 
} elseif ($time < 18) { 
    // afternoon 
    $topcolor = 'pink'; 
    $bottomcolor = 'purple'; 
} else { 
    // evening 
    $topcolor = 'yellow'; 
    $bottomcolor = 'blue'; 
} 
関連する問題