Php 创建具有指定长度的字符串

Php 创建具有指定长度的字符串,php,Php,我有一个包含数据库数据的数组,如下所示: array(4) { [0]=> string(9) "336_20235" [1]=> string(9) "336_20237" [2]=> string(9) "336_20239" [3]=> string(9) "336_20241" } 336_20235,336_20237,336_20239,336_20241 [0]=> string(887) "3-9782,3-9781,3-9776,3-9775

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

array(4) { [0]=> string(9) "336_20235" [1]=> string(9) "336_20237" [2]=> string(9) "336_20239" [3]=> string(9) "336_20241" }
336_20235,336_20237,336_20239,336_20241 
[0]=> string(887) "3-9782,3-9781,3-9776,3-9775,3-9783,3-9780,3-9779,3-9778,3-9777
有来自DB的所有元素。我需要从这些数据中准备字符串,逗号分隔,但我限制为1000个符号。所以我使用explode函数,我的字符串如下所示:

array(4) { [0]=> string(9) "336_20235" [1]=> string(9) "336_20237" [2]=> string(9) "336_20239" [3]=> string(9) "336_20241" }
336_20235,336_20237,336_20239,336_20241 
[0]=> string(887) "3-9782,3-9781,3-9776,3-9775,3-9783,3-9780,3-9779,3-9778,3-9777
但当字符串长度超过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)))));
之后的字符串如下所示:

array(4) { [0]=> string(9) "336_20235" [1]=> string(9) "336_20237" [2]=> string(9) "336_20239" [3]=> string(9) "336_20241" }
336_20235,336_20237,336_20239,336_20241 
[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调用,但是wordwrap函数需要空间来正确地分割元素


我想知道有没有更好的方法

正如我所理解的,主要问题是,当您创建字符串时,它在每个逗号后都带有空格,因此它会占用字符串符号长度

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

implode(',', $mystring)  instead of `implode(', ', $mystring)`
希望这对你有用。或者,如果您有不同的问题,请告知

正如你提到的,你能告诉我更多的地方和你提到的切片方法吗 “wordwrap函数需要空间来正确分割元素。” 正如我所看到的,您正在使用simply explode函数进行切片。
请澄清。

在我看来,主要的问题是,当你制作字符串时,每个逗号后面都有空格,因此它会占用字符串符号长度

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

implode(',', $mystring)  instead of `implode(', ', $mystring)`
希望这对你有用。或者,如果您有不同的问题,请告知

正如你提到的,你能告诉我更多的地方和你提到的切片方法吗 “wordwrap函数需要空间来正确分割元素。” 正如我所看到的,您正在使用simply explode函数进行切片。
请澄清。

我的方法是尝试将字符串按1000个字符前的最后一个逗号分割(定义在
$splitAt
中)。所以它要做的是首先用逗号分隔符将它们加在一起。然后使用查找前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);

我实现这一点的方法是尝试用1000个字符前的最后一个逗号分割字符串(在
$splitAt
中定义)。所以它要做的是首先用逗号分隔符将它们加在一起。然后使用查找前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);

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

$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]);

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

$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]);

是的,我这样做是因为在那之后我使用了wordwrap函数,当字符串将超过符号限制时,它会放置一个“|”。此空格阻止执行文字换行功能将元素切成半长:[0]=>string(887)“3-9782,3-9781,3-9776,3-97”[1]=>string(500)“82,3-9781,3-9776,3-97”,然后您可以使用@Nigel Ren的解决方案建议。它简单而完美。是的,我正在这样做,因为在那之后我使用了wordwrap函数,当字符串将超过符号限制时,它会放置一个“|”。此空格阻止执行文字换行功能将元素切成半长:[0]=>string(887)“3-9782,3-9781,3-9776,3-97”[1]=>string(500)“82,3-9781,3-9776,3-97”,然后您可以使用@Nigel Ren的解决方案建议。它简单而完美。