PHP字符串扩展

时间:2019-02-01 02:56:12

标签: php arrays string

我有一个由许多字母组成的字符串,在某些时候,可以使用一组中的一个字母,并用[]中的字母表示。我需要将这些字母扩展为实际的字符串。

从此:

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

1 个答案:

答案 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);