【问题标题】:php array combinatorics/combination analyzesphp数组组合/组合分析
【发布时间】:2012-02-26 18:11:26
【问题描述】:

我需要发现某些具有特定字符的数组的所有可能组合。

让我解释一下。

我有这个文本,其中向量组织为行:

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”的原始行。 请注意,所有其他属性值保持不变。

谢谢,

【问题讨论】:

    标签: php arrays string combinations combinatorics


    【解决方案1】:

    您可以递归地执行此操作。此解决方案假定数据集有限,我们不会冒耗尽内存的风险。

    <?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);
    }
    

    【讨论】:

    • 你好 Greg 谢谢你,但我认为有一些错误:注意:未定义变量:第 19 行 C:\wamp\www\vector_v_combination\index.php 中的向量和警告:array_search() 期望参数 2 为数组,在第 19 行的 C:\wamp\www\vector_v_combination\index.php 中给出 null
    • 可能是因为在“函数 replace_v($input) { if( $key = array_search('V', $vector) ){ ” .. $vector 应该是 $input 是吗?跨度>
    • 即使这样做它也会返回错误的答案:109; + ; - ;-; ND; + ;109 ; + ; - ;+; ND; + 109 ; + ; - ;-; ND; + ;109 ; + ; - ;+; ND; + 109 ; + ; - ;-; ND; + ;109 ; + ; - ;+; ND; + 109 ; + ; - ;-; ND; + ;109 ; + ; - ;+; ND; + 109 ; + ; - ;-; ND; + ;109 ; + ; - ;+; ND; + 109 ; + ; - ;-; ND; + ;109 ; + ; - ;+; ND; + 109 ; + ; - ;-; ND; + ;109 ; + ; - ;+; ND; + 109 ; + ; - ;-; ND; + ;109 ; + ; - ;+; ND; + 109 ; + ; - ;-; ND; + ;109 ; + ; - ;+; ND; + 109 ; + ; - ;-; ND; + ;109 ; + ; - ;+; ND; + 109 ; + ; - ;-; ND; + ;109 ; + ; - ;+; ND; +
    • 格雷格,非常感谢!这是一个很棒的功能!干得好!谢谢!
    猜你喜欢
    • 2010-11-28
    • 2011-04-14
    • 2010-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多