комбинаторика / комбинированный анализ php-массива - PullRequest
1 голос
/ 26 февраля 2012

Мне нужно найти все возможные комбинации для некоторых массивов, которые имеют определенный символ.

позвольте мне объяснить.

У меня есть этот текст, векторы которого организованы в виде строк:

1342;-;+;V;+;-;V;V;V;ND;-;-;ND;ND;+;+;ND;-;ND;ND;ND;-;+;ND;+;-;-;-;ND;-;-;ND;ND;-;ND;ND;F;ND
2343;-;-;-;-;-;-;ND;-;ND;-;-;ND;ND;-;V;ND;V;ND;ND;ND;-;+;ND;-;-;-;V;ND;V;-;ND;ND;-;ND;ND;O;ND
2344;-;-;-;-;-;-;ND;-;ND;-;ND;ND;ND;ND;+;ND;+;ND;ND;ND;-;+;ND;+;-;-;-;ND;V;ND;ND;ND;-;ND;ND;O;ND
2345;-;V;V;+;V;V;ND;-;+;-;-;-;ND;-;V;ND;+;ND;V;ND;-;+;ND;-;-;-;-;V;-;+;ND;ND;-;-;+;F;-

каждая строка является вектором .. значения атрибутов разделяются символом ";"

  • все возможные значения: числа, +, -, O, F, ND и 'V'
  • но символ V означает + и -

что мне нужно, это проверить КАЖДУЮ СТРОКУ, когда вектор имеет в любом атрибуте символ "V" потому что если есть, это означает, что этот ряд должен быть воспроизведен для всех возможностей V.

см. Этот маленький пример:

109 ; + ; - ; V ; ND ; +

Я проверил, что в этой строке один или несколько символов "V", поэтому теперь будет рассчитываться все возможности, которые можно сгенерировать для этой строки

как мы знаем V = + и - поэтому эта строка будет генерировать:

109 ; + ; - ;  +  ; ND ; +
109 ; + ; - ;  -  ; ND ; +

так как у нас есть только одно V, поэтому у нас будет 2 возможности ... проблема в том, что когда существует более одного 'V' .. как вычислить все комбинации для него ..

при создании нового текста со всеми комбинациями строк новый текст не должен содержать исходную строку с буквой «V». обратите внимание, что все остальные значения атрибутов остаются прежними.

спасибо,

1 Ответ

2 голосов
/ 26 февраля 2012

Вы можете сделать это рекурсивно. Это решение предполагает ограниченный набор данных, где мы не рискуем исчерпать память.

<?php

$input = "5;V\n4;3";

$input_arr = explode("\n", $input);
foreach( $input_arr as $vector ){
    $output = replace_v(explode(';', $vector));
    foreach( $output as $output_line ){
        echo implode(';', $output_line) . "\n";
    }
}

function replace_v($input) {
    if( $key = array_search('V', $input) ){
        $a = $b = $input;
        $a[$key] = '-';
        $b[$key] = '+';
        return array_merge(replace_v($a), replace_v($b));
    }
    return array($input);
}
...