【发布时间】:2019-02-01 02:56:12
【问题描述】:
我有一个由许多字母组成的字符串,在某些时候,可以使用一组中的一个字母,这由 [] 中的字母表示。我需要将这些字母展开成它的实际字符串。
从这里:
$str = 'ABCCDF[GH]IJJ[KLM]'
到这里:
$sub[0] = 'ABCCDFGIJJK';
$sub[1] = 'ABCCDFHIJJK';
$sub[2] = 'ABCCDFGIJJL';
$sub[3] = 'ABCCDFHIJJL';
$sub[4] = 'ABCCDFGIJJM';
$sub[5] = 'ABCCDFHIJJM';
更新:
感谢@Barmar 提供非常宝贵的建议。
我的最终解决方案是:
$str = '[GH]DF[IK]TF[ADF]';
function parseString(string $str) : array
{
$i = 0;
$is_group = false;
$sub = array();
$chars = preg_split('//', $str, -1, PREG_SPLIT_NO_EMPTY);
foreach ($chars as $key => $value)
{
if(ctype_alpha($value))
{
if($is_group){
$sub[$i][] = $value;
} else {
if(!isset($sub[$i][0])){
$sub[$i][0] = $value;
} else {
$sub[$i][0] .= $value;
}
}
} else {
$is_group = !$is_group;
++$i;
}
}
return $sub;
}
推荐的组合功能是(查看相关帖子):
function array_cartesian_product($arrays)
{
$result = array();
$arrays = array_values($arrays);
$sizeIn = sizeof($arrays);
$size = $sizeIn > 0 ? 1 : 0;
foreach ($arrays as $array)
$size = $size * sizeof($array);
for ($i = 0; $i < $size; $i++) {
$result[$i] = array();
for ($j = 0; $j < $sizeIn; $j++)
array_push($result[$i], current($arrays[$j]));
for ($j = ($sizeIn - 1); $j >= 0; $j--) {
if (next($arrays[$j]))
break;
elseif (isset($arrays[$j]))
reset($arrays[$j]);
}
}
return $result;
}
检查解决方案:
$combinations = array_cartesian_product(parseString($str));
$sub = array_map('implode', $combinations);
var_dump($sub);
【问题讨论】:
-
将方括号中的字符串转为数组。然后得到数组的所有组合。
-
你以后用
subs做什么?也许只是在正则表达式上下文中使用$str就可以了 -
@barmar 感谢您的建议,但对我来说并不完全清楚。你的建议是打破这样的数组中的字符串 $str[0] = 'ABCCDF' $str[1] = 'G' $str[2] = 'H' $str[3] = 'IJJ' $str [4] = 'K' $str[5] = 'L' $str[6] = 'M' ...然后做排列?我想我可以做 arrys,你能给我一些关于排列的建议吗?
-
@user3783243 我需要扩展字符串来搜索这些字符串,例如,我想知道
'DFIJ'是否属于这个规则