我有一个由许多字母组成的字符串,在某些时候,可以使用一组中的一个字母,并用[]中的字母表示。我需要将这些字母扩展为实际的字符串。
从此:
$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);
答案 0 :(得分:0)
将字符串转换为二维数组。括号外的部分成为单元素数组,而每个括号内的曲调变成单个字符的数组。这样您的字符串将变为:
$array =
array(array('ABCCDF'),
array('G', 'H', 'I'),
array('IJJ'),
array('K', 'L', 'M'));
然后,您只需要计算这些数组的所有组合即可;使用How to generate in PHP all combinations of items in multiple arrays的答案之一。最后,您将每个结果数组与implode
连接起来以获取字符串数组。
$combinations = combinations($array);
$sub = array_map('implode', $combinations);