创建指定长度的字符串

时间:2018-11-16 16:28:30

标签: php

我有一个数组,其中包含来自数据库的数据,如下所示:

array(4) { [0]=> string(9) "336_20235" [1]=> string(9) "336_20237" [2]=> string(9) "336_20239" [3]=> string(9) "336_20241" }

数据库中包含所有元素。我需要根据此数据准备字符串,以逗号分隔,但我限制为1000个符号。所以我正在使用爆炸功能,我的字符串看起来像这样:

336_20235,336_20237,336_20239,336_20241 

但是当字符串长度超过1000个符号时,我需要分割字符串,所以我要这样做:

(explode('|',(wordwrap(implode(', ', $mystring), 1000, '|', true))))

所以现在我有两个带有字符串的数组,例如:

[0]=> string(999) "3-9782, 3-9781, 3-9776, 3-9775, 3-9783, 3-9780, 3-9779, 3-9778, 3-9777, 1-9756, 4-9789,

如您所见,逗号后有一个空格。我不需要那个空间。我知道我可以做到:

str_replace(' ', '',(explode('|',(wordwrap(implode(', ', $mystring), 1000, '|', true)))));

该字符串如下所示:

[0]=> string(887) "3-9782,3-9781,3-9776,3-9775,3-9783,3-9780,3-9779,3-9778,3-9777

因此,现在该字符串具有887个符号,这没关系,但这是关于API调用的,限制为每小时1000个符号和200个调用。因此,我可以在此处放置更多来自数组的数据,并限制API调用,但是自动换行功能需要空间来适当地切片元素。

我想知道是否还有更好的方法?

3 个答案:

答案 0 :(得分:2)

我解决此问题的方法是尝试用1000个字符(在$splitAt中定义)前的最后一个逗号分割字符串。因此,它要做的是首先将它们全部加上逗号分隔符。然后使用strrpos()查找前1000个字符中的最后一个逗号(将其存储在$splitPos中)。然后提取第一部分并将其存储在输出中,并继续其余的字符串,直到没有其他可使用的内容为止。

$long = implode(",", $source).",";
$splitAt = 1000;
$split = [];
while ( $long ) {
    $splitPos = strrpos(substr($long,0, $splitAt), ",");
    $split[] = substr($long, 0, $splitPos);
    $long = substr($long, $splitPos+1);
}
print_r($split);

答案 1 :(得分:0)

我认为您的主要问题是因为在制作字符串时,每个逗号后面都带有空格,因此会占用您的字符串符号长度。

因此,您可以通过在爆破函数中删除逗号后的空格来避免这种情况:

implode(',', $mystring)  instead of `implode(', ', $mystring)`

希望这对您有用。或者让您知道是否有其他问题。

正如您所提到的,能否请您告诉我您所提到的切片所使用的地点和方法更多 “自动换行功能需要空间来适当地切片元素。” 如我所见,您正在使用简单的爆炸功能进行切片。 请清除。

答案 2 :(得分:0)

您可以使用正则表达式匹配来限制字符串的大小:

$data = [234234, 35464564, 23436232, 6508482, 234892, 34534524323, 43453, 2412, 34534523];
$limit = 20;

// fill $matches[0] with the length-limited strings    
preg_match_all("/.{1,$limit}(?=,)/", implode(",", $data), $matches);

// this can leave leading or trailing commas, trim them off
array_walk($matches[0], function(&$v, $k){$v = trim($v, ",");});

var_dump($matches[0]);