我有一个数组,其中包含来自数据库的数据,如下所示:
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调用,但是自动换行功能需要空间来适当地切片元素。
我想知道是否还有更好的方法?
答案 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]);