【问题标题】:PHP string expansionPHP 字符串扩展
【发布时间】: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' 是否属于这个规则

标签: php arrays string


【解决方案1】:

将您的字符串转换为二维数组。括号外的部分变成了单元素数组,而每个带括号的字符串变成了单个字符的数组。所以你的字符串会变成:

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

【讨论】:

    猜你喜欢
    • 2017-09-22
    • 1970-01-01
    • 1970-01-01
    • 2022-09-27
    • 2011-11-16
    • 1970-01-01
    • 2018-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多