【问题标题】:PHP - counting problem algorithmPHP - 计数问题算法
【发布时间】:2011-09-14 22:13:40
【问题描述】:

我需要获取一个值数组的所有组合和排列。以 sn-p 为例:

$a = array(
    1,
    2
);
$b = array(
    'foo',
    'bar'
);

$params   = array();
$params[] = $a;
$params[] = $b;

// What to do to $params so I can get the following combinations/permutations?
// 1,foo
// 2,foo
// 1,bar
// 2,bar
// foo,1
// bar,1
// foo,2
// bar,2

请记住,$params 可以是任意大小,其中的项目也可以是任意大小。

【问题讨论】:

  • 我认为最好根据 a 和 b 的大小计算出一个排列数的公式,而不是通过计算排列数来实际处理这个问题。还是你真的需要这些套装?
  • 没关系。我现在看到您不只是在寻找计数。

标签: php algorithm


【解决方案1】:
function all($array, $partial, &$result) {
    if ($array == array()) {
        $result[] = implode(',', $partial);
        return;
    }
    for($i=0; $i<count($array);$i++) {
        $e = $array[$i];
        $a = $array;
        array_splice($a, $i, 1);
        foreach($e as $v) {
            $p = $partial;
            $p[] = $v;
            all($a, $p, $result);
        }
    }
}

测试:

$a = array(1, 2, 3);
$b = array('foo', 'bar');
$c = array('a', 'b');
$params = array($a, $b, $c);

$result = array();
all($params, array(), $result);
print_r($result);

注意:如果有可能出现重复(数组包含相同的值),您可以在插入 $result 之前检查重复。

【讨论】:

  • yi_H - 这看起来很有希望。我会测试。我不确定你所说的重复是什么意思。您的意思是如果 $a 的值为 1,并且 $b 也有 1 - 那么是否存在重复项?如果是这样,出于我的目的,它们不会被视为重复。
【解决方案2】:

这是我的解决方案。它应该适用于任意数量的关联数组,即使它们包含嵌套的关联数组。

<?php
    $a = array(1,2,3);
    $b = array('foo','bar','baz', array('other','other2',array('other3','other4')));
    $params = array();
    $params[] = $a;
    $params[] = $b;

    $elements = array();

    foreach($params as $param) {
     addElement($param,$elements);
    }

    function addElement($arg,&$result) {
        if(!is_array($arg)) {
            $result[] = $arg;
        } else {
            foreach($arg as $argArray) {
                addElement($argArray,$result);
            }
        }
    }

    for($i=0; $i<count($elements); $i++) {
        $curElement = $elements[$i];
        for($j=0; $j<count($elements); $j++) {
            if($elements[$j] != $curElement) {
                $final_results[] = $curElement.','.$elements[$j];
            }
        }
    }
    print_r($final_results);

?>

http://codepad.viper-7.com/XEAKFM

【讨论】:

  • 这将为您提供一个数组$final_results,其中包含所有排列和组合
【解决方案3】:

这是一个可能的解决方案codepad...

$array = array(
    0   => array(
        'foo',
        'bar'
    ),
    1   => array(
        1,
        2,
        3
    ),
    2   => array(
        'x',
        'y',
        'z'
    ),
    3   => array(
        7,
        8,
        9
    )
);

array_permutations($array, $permutations);
print_r($permutations);

public function array_permutations($array, &$permutations, $current_key = 0, $current_subkey = 0)
{   
    if(!isset($array[$current_key][$current_subkey]))
    {
        return;
    }

    $current_val = $array[$current_key][$current_subkey];

    foreach($array as $array_key => $row)
    {
        foreach($row as $row_key => $sub_val)
        {
            if($array_key === $current_key)
            {
                if($row_key !== $current_subkey)
                {
                    $permutations[] = $current_val . ', ' . $sub_val;
                }
            }
            else 
            {
                $permutations[] = $current_val . ', ' . $sub_val;
            }
        }
    }

    $next_key = ($current_subkey == (count($array[$current_key]) - 1)) ? $current_key + 1 : $current_key;
    $next_subkey = ($next_key > $current_key) ? 0 : $current_subkey + 1;
    array_permutations($array, $permutations, $next_key, $next_subkey); 
}

【讨论】:

    【解决方案4】:

    试试这个,希望对你有帮助

    $a = array(
        1,
        2,
        4
    );
    $b = array(
        'foo',
        'bar',
        'zer'
    );
    $c = array(
        'aaa',
        'bbb'
    );
    
    $params   = array();
    $params[] = $a;
    $params[] = $b;
    $params[] = $c;
    
    $sizeofp = count($params);
    for($i=0 ; $i < $sizeofp ; $i++){
        foreach ($params[$i] as $paramA) {
            for($j=0 ; $j < $sizeofp ; $j++){
                if($j == $i){
                    continue;
                }
                foreach($params[$j] as $paramB){
                    echo "\n".$paramA.",".$paramB;  
                }
            }
        }
    }
    

    【讨论】:

    • $params 的大小未知。这假设 $params 包含 2 个元素。
    • 不,这假设 $params 可能是无穷无尽的。测试一下!事实上,不仅 $params 可以是无穷无尽的。添加到 $params 的每个 $a、$b 可以具有任意大小。我会将测试源添加到我的回复中。
    • 啊!我明白了,你需要结合每一个可能的组合!那么@yi_H 的回复就OK了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-27
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    相关资源
    最近更新 更多