我正在寻找将字符串拆分成数组的方法,排序为str_split()
,其中块的大小各不相同。
我可以通过使用一堆substr()
循环遍历字符串来实现这一点,但这看起来既不优雅也不高效。是否有一个接受字符串和数组的函数,如(1, 18, 32, 41, 108, 125, 137, 152, 161
),并产生一组适当切碎的字符串片段?
爆炸是不合适的,因为块是由不同数量的空格分隔的。
答案 0 :(得分:9)
PHP中没有任何内容可以帮助您(这有点具体)。所以作为radashk只是siad,你只需要写一个函数
function getParts($string, $positions){
$parts = array();
foreach ($positions as $position){
$parts[] = substr($string, 0, $position);
$string = substr($string, $position);
}
return $parts;
}
这样的事情。然后你可以在任何你喜欢的地方使用它,所以它很干净:
$parts = getParts('some string', array(1, ... 161));
如果你真的想要,你可以将它破坏成正则表达式:
^.{1}.{18} <lots more> .{161}$
符合您的要求。
答案 1 :(得分:2)
仅供将来参考,正则表达式方法@jay建议如下:
$regex="/(.{1})(.{18})(.{32})(.{41})(.{108})(.{125})(.{137})(.{152})(.{161})/";
preg_match($regex,$myfixedlengthstring,$arr);
其中 $ myfixedlengthstring 是目标字符串, $ arr 为您提供结果
答案 2 :(得分:1)
我会使用unpack():
$str = "?ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890....";
$array = unpack("a1first/a26second/a10third/a*rest",$str);
print_r($array);
这将返回:
Array
(
[first] => ?
[second] => ABCDEFGHIJKLMNOPQRSTUVWXYZ
[third] => 1234567890
[rest] => ....
)
答案 3 :(得分:0)
稍微灵活的变体,对解析具有固定长度记录的ASCII表非常有用:
function ParseIrregularString ($string, $lengths)
{
$parts = array();
foreach ($lengths as $StringKey => $position)
{
$parts[$StringKey] = substr($string, 0, $position);
$string = substr($string, $position);
}
return $parts;
}
提交以下内容:
$string = "abcdefghiklmnopqrstuvz";
$lengths = array ("field1"=>4, "field2"=>3, "field3"=>5, "field4"=>2);
print_r (ParseIrregularString ($string, $lengths));
返回:
Array ( [field1] => abcd [field2] => efg [field3] => hiklm [field4] => no )