Расширение строки PHP - PullRequest
       6

Расширение строки PHP

0 голосов
/ 01 февраля 2019

У меня есть строка, состоящая из множества букв, в какой-то момент можно использовать одну букву из группы, и это представлено буквами, заключенными в [].Мне нужно расширить эти буквы в настоящие строки.

Из этого:

$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 голосов
/ 01 февраля 2019

Преобразуйте вашу строку в 2-мерный массив.Части вне скобок становятся одноэлементными массивами, в то время как каждая цепочка в скобках превращается в массив из отдельных символов.Таким образом, ваша строка станет:

$array = 
    array(array('ABCCDF'),
          array('G', 'H', 'I'),
          array('IJJ'),
          array('K', 'L', 'M'));

Тогда вам просто нужно вычислить все комбинации этих массивов;используйте один из ответов на Как генерировать в PHP все комбинации элементов в нескольких массивах .Наконец, вы объединяете каждый из полученных массивов с помощью implode, чтобы получить массив строк.

$combinations = combinations($array);
$sub = array_map('implode', $combinations);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...