PHP 数组组合
2022-08-30 16:19:44
我有一个包含7个数字(1,2,3,4,5,6,7)的数组,我想选择5个数字,如
(1,2,3,4,5),(1,2,3,4,6),(1,2,3,4,7)。
请注意,(1,2,3,4,5)等于(4,5,3,1,2),因此输出中只应包含其中之一。
我想知道PHP中是否有函数或任何算法可以做到这一点?我不知道从哪里开始。你可以帮我吗?
我希望将7个给定数字的所有组合(它们取自数组)放入5个插槽中,而不考虑顺序。
我有一个包含7个数字(1,2,3,4,5,6,7)的数组,我想选择5个数字,如
(1,2,3,4,5),(1,2,3,4,6),(1,2,3,4,7)。
请注意,(1,2,3,4,5)等于(4,5,3,1,2),因此输出中只应包含其中之一。
我想知道PHP中是否有函数或任何算法可以做到这一点?我不知道从哪里开始。你可以帮我吗?
我希望将7个给定数字的所有组合(它们取自数组)放入5个插槽中,而不考虑顺序。
您可以使用此处找到的解决方案 http://stereofrog.com/blok/on/070910。
如果链接向下,这里是代码....
class Combinations implements Iterator
{
protected $c = null;
protected $s = null;
protected $n = 0;
protected $k = 0;
protected $pos = 0;
function __construct($s, $k) {
if(is_array($s)) {
$this->s = array_values($s);
$this->n = count($this->s);
} else {
$this->s = (string) $s;
$this->n = strlen($this->s);
}
$this->k = $k;
$this->rewind();
}
function key() {
return $this->pos;
}
function current() {
$r = array();
for($i = 0; $i < $this->k; $i++)
$r[] = $this->s[$this->c[$i]];
return is_array($this->s) ? $r : implode('', $r);
}
function next() {
if($this->_next())
$this->pos++;
else
$this->pos = -1;
}
function rewind() {
$this->c = range(0, $this->k);
$this->pos = 0;
}
function valid() {
return $this->pos >= 0;
}
protected function _next() {
$i = $this->k - 1;
while ($i >= 0 && $this->c[$i] == $this->n - $this->k + $i)
$i--;
if($i < 0)
return false;
$this->c[$i]++;
while($i++ < $this->k - 1)
$this->c[$i] = $this->c[$i - 1] + 1;
return true;
}
}
foreach(new Combinations("1234567", 5) as $substring)
echo $substring, ' ';
12345 12346 12347 12356 12357 12367 12456 12457 12467 12567 13456 13457 13467 13567 14567 23456 23457 23467 23567 24567 34567
<?php
echo "<pre>";
$test = array("test_1","test_2","test_3");
// Get Combination
$return = uniqueCombination($test);
//Sort
sort($return);
//Pretty Print
print_r(array_map(function($v){ return implode(",", $v); }, $return));
function uniqueCombination($in, $minLength = 1, $max = 2000) {
$count = count($in);
$members = pow(2, $count);
$return = array();
for($i = 0; $i < $members; $i ++) {
$b = sprintf("%0" . $count . "b", $i);
$out = array();
for($j = 0; $j < $count; $j ++) {
$b{$j} == '1' and $out[] = $in[$j];
}
count($out) >= $minLength && count($out) <= $max and $return[] = $out;
}
return $return;
}
?>
Array
(
[0] => test_1
[1] => test_2
[2] => test_3
[3] => test_1,test_2
[4] => test_1,test_3
[5] => test_2,test_3
[6] => test_1,test_2,test_3
)