php如何平均分割字符串 例分割为四部分
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了php如何平均分割字符串 例分割为四部分相关的知识,希望对你有一定的参考价值。
忘记说了 字符为中英混合的
首先你要确认该字符串的编码如果是gbk的编码 则一个汉字占用2个字节 如果是utf-8编码的话 则占用3个字节。
<?
$s='这是1个中英混合的abcd';
$s=iconv('gbk','utf-8',$s);
echo $len=strlen($s);//取得字符串长度 一个gbk汉字是占用2个字节 而utf-8是占3个字节
echo "<br>";
echo $mblen=mb_strlen($s,'utf-8');//获取单词的长度 一个汉字是1个字节
?>
明白这个原理 就不难了 下面俺来写个函数给你
<?
$s='这是1个中英混合的abcd';
$s=iconv('gbk','utf-8',$s);//如果你确认你的字符串的编码是UTF-8就去掉这句
print_r(strSplit($s,4));
//字符串切割函数 str为字符串 num为每段分割为几
function strSplit($str,$num=4)
$len=mb_strlen($str,'utf-8');//获取字符串长度 每个汉字算1
$partNum=ceil($len/$num);
$arr=array();
for($i=0;$i<$partNum;$i++)
$begin=$i*$num;
$arr[]=iconv_substr($str,$begin,$num,'utf-8');
return $arr;
?> 参考技术A $str = 'asdhjiuygfrewsghbvfdfswe';
$len = strlen($str);
$part = ($len/4);
$arr = str_split($str, $part);
print_r($arr);
若想要平均分成4部分,必须得保证字符串的总长度是4的整数倍。追问
我的字符串里有中英文怎么办呢?
追答这个我没试,如果是那样那就太不确定了,一个汉字(utf-8)3个字节,gb2312 好像是2个字节。那就不好弄了。好像是没有那样的函数,都是英文的就是我说的那种情况,你可以试试中英混合的,那样可能会出现乱码的。
追问恩我试了就是出现了乱码。哎不好搞哟
追答你实现什么功能呢?想做什么判断呢?说不定是你的切入点不对呢?也许你遇到的问题不应该这样解决。 加我的百度hi bd_fengzhenbo
参考技术B 应该是使用split这个函数吧~Postgresql中的日期限制运行平均值 - 如何划分为四个星期
【中文标题】Postgresql中的日期限制运行平均值 - 如何划分为四个星期【英文标题】:Date-bound running average in Postgresql - how to partition into four weeks 【发布时间】:2019-08-20 15:37:10 【问题描述】:我有一张表,其中包含 sales_date(每周:每周六)、item_ID 和 sales。我想要一个四个星期的运行平均值。我需要将我的数据划分为每个 ID 为期 4 周的部分,但我不知道如何执行语法。
示例表:
ID date value four_wk_average
<p>123 04/05/2019 1640.88 1640.88
<p>123 11/05/2019 2093.4 1867.14
<p>123 18/05/2019 2671.57 2135.28
<p>123 25/05/2019 2034.6 2110.11
<p>123 01/06/2019 1564.62 2001.01
<p>123 08/06/2019 2143.29 2024.73
<p>123 15/06/2019 2007 2022.19
<p>123 22/06/2019 2329.35 2060.59
<p>123 29/06/2019 2794.32 2142.11
<p>123 06/07/2019 3380.05 2265.91
当我运行下面的代码时,我得到了最右边的列 - 这是一个运行平均值,但它需要所有行,而不仅仅是我想要的当前行和前三行。
select
id,
date,
value,
avg(value) over (partition by id, (x.date between x.date and x.date - '22 days'::interval) order by date)
from
(select id, date::date, value from sales where date >= '2019-05-01') x
正确的值是
ID date value four_wk_average
<p>123 04/05/2019 1640.88 1640.88
<p>123 11/05/2019 2093.4 1867.14
<p>123 18/05/2019 2671.57 2135.28
<p>123 25/05/2019 2034.6 2110.11
<p>123 01/06/2019 1564.62 2091.05
<p>123 08/06/2019 2143.29 2103.52
<p>123 15/06/2019 2007 1937.38
<p>123 22/06/2019 2329.35 2011.07
<p>123 29/06/2019 2794.32 2318.49
<p>123 06/07/2019 3380.05 2627.68
我认为我的分区将我的间隔部分作为布尔测试并返回 TRUE - 我不知道如何在窗口函数中表示日期范围。
谢谢!
【问题讨论】:
【参考方案1】:demo:db<>fiddle
方式 1:这适用于 Postgres 11+ 和每周几条记录
SELECT
*,
AVG(value) OVER (ORDER BY the_date RANGE BETWEEN interval '4 weeks - 1 day' PRECEDING AND CURRENT ROW)
FROM
sales
间隔为 4 周:4 周减去 1 天加上当天。
方式 2:这也适用于 Postgres 并且仅当确实每周只有一条记录:
SELECT
*,
AVG(value) OVER (ORDER BY the_date ROWS BETWEEN 3 PRECEDING AND CURRENT ROW)
FROM
sales
Further reading 关于窗口函数和ROWS
和RANGE
子句
方式 3:这是 Postgres 版本 和 每周几条记录的方式:
SELECT
s1.*,
(SELECT AVG(s2.value)
FROM sales s2
WHERE s2.the_date <= s1.the_date
AND s2.the_date > s1.the_date - interval '4 weeks')
FROM sales s1;
【讨论】:
Lifesaver:我使用了方式 2,效果很好。也感谢您的进一步阅读 - 我试图在互联网上搜索如何做到这一点,但我找不到任何东西。再次感谢。 嗨!我很抱歉没有早点回答。当我将所有数据放在一起时,这不起作用 - 在这种情况下,数据按国家和 ID 分组。您的三个选项中哪一个最适合这种情况?以 Excel 的方式思考,我想做一个 AVERAGEIFS,条件是 ID 和国家/地区匹配。或者我可以对我正在执行此操作的子查询进行任何排序,以使 PRECEDING ROW 语法起作用?谢谢! 不过,我当然可以尝试帮助您。但在那种情况下,我也确实需要样本数据和预期输出。所以请尝试创建一个小提琴(就像我在回答中所做的那样)和/或打开一个全新的问题!以上是关于php如何平均分割字符串 例分割为四部分的主要内容,如果未能解决你的问题,请参考以下文章
shell中分割字符串之后怎么取得最后一个东西的值?如果可以的话,怎么将分割后的结果保存到一个数组中?