【教程】PHP输出花样文本 - 竖式波浪 [复制链接]
【作者】Shawna 2020年4月1日 01:47:48

php输出花样文本 - 竖式波浪

晚上和徒弟聊天,徒弟不知道从哪里搞得工具,可以把文本转成竖式波浪文本发出来,不过,他肯定不是自己写的,想了想机制,差不多难度不大,就作为本周作业了。

本次例程仅考虑输入文本全部为2个字节中文汉字

聊天记录

  • 首先要找出这个格式的的 特点 => 竖式 波浪状 一行一个汉字

    我们可以推断一下需要用到的 函数 => for循环 substr截取字符串

  • 可以看出第一行汉字前面有4个字节占位的空格,第二行为2个,第三行为0个,第四行为2个,以此类推。控制最长行汉字前有8个空格。

首先定义函数TrickText(名称自拟)
  1. <?php
  2. echo TrickText("明天开始了有时间", "\n");
  3. //定义函数,设置2个参数,参数1为传入文本,参数2为换行符
  4. function TrickText($text, $br = "<br>")
  5. {
  6. return "";
  7. }
使用substr将字符串分割开

一个中文占2个字节,但使用编码为UTF8编码,汉字一般为3个字节,以下进行对比:

代码 结果
return substr($text,0,1);
return substr($text,0,2);
return substr($text,0,3);
return substr($text,0,9); 明天开
return substr($text,3,3);
开始截取汉字,使用for命令
  1. for ($tmp_i = 0; $tmp_i <= (strlen($text)/3) - 1; $tmp_i ++) {
  2. echo "$tmp_i:".substr($text, $tmp_i*3, 3)."\n";
  3. }

其中,for命令参数2:$tmp_i <= 后面的数是取字符串长度并÷3-1,目的是防止后面substr取到空值,输出结果如下:

  1. 0:明
  2. 1:天
  3. 2:开
  4. 3:始
  5. 4:了
  6. 5:有
  7. 6:时
  8. 7:间
当然,这只是测试阶段,我们还需要结合数组,将截取到的汉字存成数组形式
  1. <?php
  2. echo TrickText("明天开始了有时间", "\n");
  3. //定义函数,设置2个参数,参数1为传入文本,参数2为换行符
  4. function TrickText($text, $br = "<br>")
  5. {
  6. $text_array = array();
  7. for ($tmp_i = 0; $tmp_i <= (strlen($text)/3) - 1; $tmp_i ++) {
  8. $text_array[] = substr($text, $tmp_i*3, 3);
  9. }
  10. print_r($text_array);
  11. return "";
  12. }

输出结果如下:

  1. Array
  2. (
  3. [0] =>
  4. [1] =>
  5. [2] =>
  6. [3] =>
  7. [4] =>
  8. [5] =>
  9. [6] =>
  10. [7] =>
  11. )
已经将文本保存成数组形式了,接下来就是对样式(竖式波浪)的处理了,要用到for循环
即(php输出花样文本 - 竖式波浪)完整代码如下
  1. <?php
  2. echo TrickText("明天开始了有时间", "\n");
  3. //定义函数,设置2个参数,参数1为传入文本,参数2为换行符
  4. function TrickText($text, $br = "<br>")
  5. {
  6. $text_array = array();
  7. for ($tmp_i = 0; $tmp_i <= (strlen($text) / 3) - 1; $tmp_i++) {
  8. $text_array[] = substr($text, $tmp_i * 3, 3);
  9. }
  10. $tmp_number = 4;//起始汉字前4个空格
  11. $tmp_add = "1";//用于区分正向逆向
  12. $tmp_text = "";//用于储存结果文本
  13. //循环次数为汉字字数 count为取数组成员数
  14. for ($tmp_j = 0; $tmp_j <= count($text_array); $tmp_j++) {
  15. //如果变量中已有内容则换行
  16. if ($tmp_text != "") $tmp_text .= $br;
  17. //在结果文本后面增加额定数量的空格
  18. for ($tmp_k = 0; $tmp_k <= $tmp_number; $tmp_k++) {
  19. $tmp_text .= " ";
  20. }
  21. //在结果文本后面增加汉字
  22. $tmp_text .= $text_array[$tmp_j];
  23. //如果减去2个空格为负数则改为加上2个空格,以实现波浪折回的效果
  24. if ($tmp_number - 2 < 0) {
  25. $tmp_add = -1;
  26. } else if ($tmp_number + 2 > 8) {//保证不会过长,再折回
  27. $tmp_add = 1;
  28. }
  29. //用于下一次循环时确定空格数量
  30. $tmp_number = $tmp_number - (2 * $tmp_add);
  31. }
  32. return $tmp_text;
  33. }

最终竖式波浪输出效果:

最终效果