打印围城

61 篇文章 0 订阅

思路分析:

最开始我想到的是直接使用类似于for循环,但仔细思考实际上使用递归更方便。理由外层包围内层,并且依赖于内层。基本上内层构建好了,外层包一层即可。所以有了以下代码

// 生成待输出数组
function create($argv)
{
    $cols = count($argv) * 2 - 1;

    if ($cols == 1) {
        return $argv;
    } else {
        // 缓存外围填充值
        $wrap = array_shift($argv);
        // 内部数组分层
        $nest_arr = create($argv);
        $chunk = array_chunk($nest_arr, $cols - 2);
        // 左右包围
        $wrap_arr = [];
        foreach($chunk as $v){
            $wrap_arr= array_merge( $wrap_arr, [$wrap],$v,[$wrap]);
        }
        // 上下包围
        $repeat = array_pad([], $cols, $wrap);
        $wrap_arr = array_merge($repeat, $wrap_arr, $repeat);

        return $wrap_arr;
    }
}

// 加换行符转化为字符串输出 
function arr2str($arr){
    $forArr = array_chunk($arr, sqrt(count($arr)));
    $str = '';
    foreach($forArr as $v){
        $str .= implode($v);
        $str .="\n";
    }
    return $str;
}
//测试数据
$pa = ['a', 'b','c'];

//命令行测试
if($argc < 3){
    print("Parameter Error");
    return;
}else{
    array_shift($argv);
    $pa = $argv;
}
 echo arr2str( create($pa));
小结:通过这次编程,虽然花了一个多小时,但收获良多。感觉编程思路的确是第一出路,有了思路实践起来更是得心应手。


需求详情

给定一定参数,从左往右依次输出参数并包围下一个参数,直到最后一个参数在最中间并且输出一次。需求示例

$ php circle.php a b

aaa
aba
aaa
$ php circle.php @ . !

@@@@@
@...@
@.!.@
@...@
@@@@@
$ php circle.php 众 从 人 我

众众众众众众众
众从从从从从众
众从人人人从众
众从人我人从众
众从人人人从众
众从从从从从众
众众众众众众众

目标

  1. circle.php 后的参数少于 2 个报错,直接打印 Parameter Error
  2. 参数可以是字母,数字,特殊字符等

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值