思路分析:
最开始我想到的是直接使用类似于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 众 从 人 我
众众众众众众众
众从从从从从众
众从人人人从众
众从人我人从众
众从人人人从众
众从从从从从众
众众众众众众众
目标
circle.php
后的参数少于 2 个报错,直接打印Parameter Error
- 参数可以是字母,数字,特殊字符等