简单文本框架的问题

时间:2011-08-04 20:10:43

标签: php

基本上,我正在尝试在文本周围创建一个框架,并且在文本所在的第三行上,它不打印出应该是围绕它的“填充”的#。

******************
*################*
*#HELLO, JUSTIN!*
*################*
******************

这就是它的样子 - 之后!在$ greeting变量中,应该有一个#。代码如下,任何人都可以解释为什么会这样吗?

<html>
<body><?php
    $pad = 1;
    $rows = ($pad * 2) + 3;
    $greeting = "HELLO, JUSTIN!";
    $col = strlen($greeting) + (2 * $pad) + 2;


for ($r = 0; $r != $rows; ++$r)
{
    for ($c = 0; $c != $col; ++$c)
    {
        if ($r == $pad + 1 && $c == $pad + 1)
        {
            echo $greeting;
            $c += strlen($greeting);
            //echo "#";
        }
        else 
        {
            if ($r == 0 || $r == $rows - 1 || $c == 0 || $c == $col - 1)
                echo "*";
            else
                echo "#";
        }
    }
    echo "<br />";
}
?></body>
</html>

3 个答案:

答案 0 :(得分:1)

在垂直填充(上方和下方)的$问候是容易做到的,最棘手的部分似乎得到含有$问候以显示右行。

尝试在for循环中使用&lt; =(小于或等于),而不是!=(不等于[s])。 您必须更改if语句的范围。

$text = "justin rocks my socks!";  

$asteriskAt = 0;
$poundAt = 1;

$padding_left = 2;
$padding_right = 2;

//table looks like
//ABCDEFG
//HIJKLMN
//OPQRSTU

//row view
//0000000
//1111111
//3333333

//column view
//0123456
//0123456
//0123456

// ^ all the same "table" (anything with x and y, or rows and cols), just different ways of viewing it.

$num_cols = strlen($text) + ($padding_left + $padding_right); //so far so good?

//strlen($text) evaluates to 22
//$num_cols evaluates to 26 ( = 22 + 2 + 2)

for ($c = 0; $c <= $num_cols; ++$c) {
    if ($c == $asteriskAt || $c == $num_cols - $asteriskAt) {
        echo '*';
    }
    if ($c == $poundAt || $c == $num_cols - $poundAt) {
        echo '#';
    }

    if ($c > $poundAt || $c < $num_cols - $poundAt) { 
        // is it clear why I picked this "range" ?
        // if you do $c > 2 || $c < $num_cols - 2
        // you will display something different
        // because the cols and rows are zero-indexed
        // 
        //cols
        // 0123456
        //   ^2 is actually slot #3
        //our thing will look like 
        //01___56 
        //compared with
        //0123456
        //01___56 <- (padding dudes)
        //0123456

        $idx = $c - $padding_left;
        echo $text[$idx];
    }
}

$text = "justin rocks my socks!"; $asteriskAt = 0; $poundAt = 1; $padding_left = 2; $padding_right = 2; //table looks like //ABCDEFG //HIJKLMN //OPQRSTU //row view //0000000 //1111111 //3333333 //column view //0123456 //0123456 //0123456 // ^ all the same "table" (anything with x and y, or rows and cols), just different ways of viewing it. $num_cols = strlen($text) + ($padding_left + $padding_right); //so far so good? //strlen($text) evaluates to 22 //$num_cols evaluates to 26 ( = 22 + 2 + 2) for ($c = 0; $c <= $num_cols; ++$c) { if ($c == $asteriskAt || $c == $num_cols - $asteriskAt) { echo '*'; } if ($c == $poundAt || $c == $num_cols - $poundAt) { echo '#'; } if ($c > $poundAt || $c < $num_cols - $poundAt) { // is it clear why I picked this "range" ? // if you do $c > 2 || $c < $num_cols - 2 // you will display something different // because the cols and rows are zero-indexed // //cols // 0123456 // ^2 is actually slot #3 //our thing will look like //01___56 //compared with //0123456 //01___56 <- (padding dudes) //0123456 $idx = $c - $padding_left; echo $text[$idx]; } }

顺便说一句,www.ideone.com也有PHP翻译!真棒。

检查这两个输出的差异,并注意我只更改了for循环中的一个运算符:

http://ideone.com/M1lpM //星号:D

http://ideone.com/JqsTx //没有最后的星号=(

你发布的代码也不错,特别是如果它第一次尝试的话! 但实际上,编程和软件通常需要精确度,而且你不能因为做你所说的而对电脑生气。因此,在阶段或步骤中工作要好得多,因为在调试时可以使用清晰度=)

程序员逐渐学习(如果他们像我一样顽固),这不仅仅是让代码在你开始编写代码后2分钟工作,而是让它具有可读性和可变性,可维护性将来。开发是一个很好的习惯,因为在你再次查看你的代码之前你永远不会知道它会持续多久“这个疯狂的人到底做了什么?!”你可能会想,然后意识到你在一年前写的......你永远不知道谁最终会维护不管你做什么,你是否在商业应用的一个开源项目或工作作出贡献。

所以,一些建议(我会告诉我6年前的自己,真的):

如果您对我发布的代码有任何疑问,请随时询问=)

希望这可以帮助你找出你为什么贴不工作,你预料到的方式代码,但你可以很轻松的做出Gordian Knot这是非常困难的,而不完美的智慧,通过削减/生活冥想和节制

答案 1 :(得分:0)

你忘记了填充:

更改

$c += strlen($greeting);

$c += strlen($greeting) - $pad;

答案 2 :(得分:0)

$c += strlen($greeting);

必须替换为

$c += strlen($greeting)-1;