2011-12-21 16 views
1

私はPHP初心者です。私は次のような数字を印刷するプログラムを書こうとしています。数値の印刷次元に問題があります。

1  1 
12  21 
123 321 
1234 4321 
1234554321 

私は次のコードを書いています。

<?php 

$n=5; 
for($i=1; $i<=$n; $i++) 
{ 
    echo "<br />"; 
    for($j=1; $j<=$i; $j++) 
    { 
     echo $j; 
    } 
} 

?> 

結果は次のように表示されます。

1 
12 
123 
1234 
12345 

私はこれを行うことができますどのように

1 
    21 
    321 
4321 
54321 

ようにそれを逆にしないだろうか?

+0

この宿題ですか?これまで何をやっていますか? – Amadan

答えて

1

最も簡単な、ハードコーディングされたバージョン:

<?php 
$text = "1  1 
12  21 
123 321 
1234 4321 
1234554321"; 
echo $text; 
?> 

編集

より一般的な解決策:ここ

<?php 
$n = 5; 
$seq1 = ''; 
$seq2 = ''; 
$format1 = sprintf("%%-%su", $n); //right justified with spaces 
$format2 = sprintf("%%%su", $n); //left justified with spaces 

for($i=1; $i<=$n;$i++){ 
    $seq1 .= $i; 
    $seq2 = strrev($seq1); 
    echo sprintf("$format1$format2\n", $seq1, $seq2); 
}; 
?> 
+0

私は文字通りの解決法(そしてチャックル)をupvotedしましたが、OPはそれによって何も学ばないでしょう:p – Amadan

+0

アマダンと私はあなたに同意します - 私は 'sprintf'で今バージョンを書いています –

+0

私は論理が必要ですコーディングはエコーでプリントするだけではありません。 – designersvsoft

0

があなたの問題に私の解決策です。

9より大きい数字を使用している可能性があるため、最善の解決策ではありません。

しかし、要点は、必要に応じて作業できる解決策の出発点であるということです。

arrayを使用して、印刷する番号を保存することができます。 数字がarrayにあるので、すべて数字が印刷されるように、foreachループを使用することができます。

PHPのstr_repeat()関数を使用すると、数字の各文字列の間に挿入するスペースの数を把握できます。 以下の解決策は、連想配列ではなくデフォルトの数値標識を持つ配列を使用する場合にのみ機能します。 str_repeat()関数の計算の一部で変数$keyが使用されているためです。 $key変数を使用したくない場合は、それを変更する方法を理解できるはずです。

数字を逆順にするときは、既に文字列に格納されているので、PHPのstrrev()関数を使用して別の変数に格納することができます。

最後に、行末を改行してドキュメントに行を印刷するだけで済みます。

str_repeat()関数は、HTMLエンティティ&nbsp;を繰り返しています。 これは、ブラウザが通常の空白を1文字に圧縮するためです。

また、フォントをmonospaceに変更するためにブロックstyleを含めました。 これは、すべての番号が確実に一致するようにするためです。

<style> 
    html, body { 
     font: 1em monospace; 
    } 
</style> 
<?php 
$numbers = array(1, 2, 3, 4, 5); 
$numbers_length = count($numbers); 
$print_numbers = ''; 
$print_numbers_rev = ''; 

foreach($numbers as $key => $value) { 
    $spaces = str_repeat('&nbsp;', ($numbers_length - ($key + 1)) * 2); 
    $print_numbers .= $value; 
    $print_numbers_rev = strrev($print_numbers); 

    echo $print_numbers . $spaces . $print_numbers_rev . '<br />'; 
} 

編集:配列のない

ソリューション:

<style> 
    html, body { 
     font: 1em monospace; 
    } 
</style> 
<?php 
$numbers = 9; 
$numbers_length = $numbers + 1; 
$print_numbers = ''; 
$print_numbers_rev = ''; 

for($i = 0; $i <= $numbers; ++$i) { 
    $spaces = str_repeat('&nbsp;', ($numbers_length - ($i + 1)) * 2); 
    $print_numbers .= $i; 
    $print_numbers_rev = strrev($print_numbers); 

    echo $print_numbers . $spaces . $print_numbers_rev . '<br />'; 
} 
+0

ありがとうございます。私は初心者です。私は配列の概念をまだ研究していない。純粋なforループのみを使用するだけで、配列のコンセプトでそれを行う可能性があることを知りたいですか? – designersvsoft

+0

@designersvsoftご連絡いただきありがとうございます。私の回答が更新され、配列なしで表示されます。これは、0から何かを$ numbers変数に入れたものだけを出力します。開始点を変更するには、forループの$ i変数を変更するだけです。 –

1

わかりました。あなたが書いたものはかなり良いです。あなたが望むことをするためには、いくつかの変更が必要です。最初の問題は、それをHTMLにレンダリングすることです.HTMLは空白をレンダリングしません(これが必要です)。 2つの解決策:スペースには&nbsp;を使用し、プロポーショナルフォントを使用するか、すべてを<pre>タグに入れて、ほぼ同じことを達成してください。したがって、開始時にecho "<pre>";、末尾にecho "</pre>";があります。

次は - 内部ループがない$iに行ってください。毎回5に行き、$j <= $iの場合は数字を、それ以外の場合はスペースを印刷します。

次に、このループのすぐ隣にもう1つ、逆に(5で始まり1で終わります)、まったく同じことをします。

ビオラは楽器です。

+0

は主にビオラのためにupvoted - しかし、アルゴリズムの素晴らしい説明 –

0
$n = 5; 

for ($i = 1; $i <= $n; $i++) { 
$counter .= $i; 
$spaces = str_repeat("&nbsp;", ($n-$i)*2); 
echo $counter . $spaces . strrev($counter) . "<br/>"; 
} 
0
<div style="position:relative;width:100px;height:auto;text-align:right;float:left;"> 
<?php 

$n=5; 
for($i=1; $i<=$n; $i++) 
{ 
    echo "<br />"; 
    for($j=1; $j<=$i; $j++) 
    { 
     echo $j; 
    } 
} 

?> 
</div> 
関連する問題