如何将数组值成对?

4

考虑以下数组作为输入:

$input = array('A', 'B', 'C', 'D');

我正在寻找一种方法来循环遍历这个数组,写下每对两个值的所有可能性。在这个例子中:AB AC AD BC BD CD。请注意,BA不算作一对,因为AB已经被提到了。
$output = array(
  'A' => 'B',
  'A' => 'C',
  'A' => 'D',
  'B' => 'C',
  'B' => 'D'
);

任何关于如何开始的建议都将不胜感激!

2
我认为您不能拥有多个具有相同键“A”的数组元素。 - Aziz
你需要的是一种不同的数据结构。数组不适合你的目的。 - Aziz
1
一个带有数字索引的数组可以这样写:array('AB', 'AC', ...) - js-coder
可能的输出是:C => D,A => A,B => B ...。 - user935375
5个回答

2
$output=array();
for ($i=0;$i<sizeof($input);$i++) {
  $k=$input[$i];
  for ($j=$i+1;$j<sizeof($input);$j++) {
    $v=$input[$j];
    $output[]=array($k=>$v);
  }
}

编辑

根据您的评论,重新组织的输出结果如下:

$output=array();
//See below
for ($i=0;$i<sizeof($input);$i++) {
  $k=$input[$i];
  $v=array();
  for ($j=$i+1;$j<sizeof($input);$j++) {
    $v[]=$input[$j];
  }
  $output[]=array($k=>$v);
}

如果您不想要最后一行是'D'=>Array(),则需要更改。
for ($i=0;$i<sizeof($input);$i++) {

为了

for ($i=0;$i<sizeof($input)-1;$i++) {

这个很好用;但在Gaurav的样本输出之后进行重建是否可能?$output = array('A' => array('B','C','D'), 'B' => arrat('C','D'));那比我想出来的要干净得多 :) - Pr0no
我不得不将 $output[]=array($k=>$v); 改为 $output[$k]=$v; 才能得到我想要的输出,但还是谢谢你!你帮了我大忙 :) - Pr0no
@Reveller 啊,我明白你的意思了。我误解了(=懒惰阅读)所需的结构。 - Eugen Rieck

1

可能是这样的东西;

$input = array('A', 'B', 'C', 'D');
$input_copy = $input;
$output = array();
$i = 0;
foreach($input as $val) {
    $j = 0;
    foreach($input_copy as $cval) {
        if($j < $i) break;
        $output[] = array($val => $cval);
        $j++;
    }
    $i++;
}

$output = array(
    0 => array('A' => 'A'),
    1 => array('A' => 'B'),
    2 => array('A' => 'C'),
    ...
);

请注意,您的输出数组是不可能的,因为每次都会覆盖键。

加点自己的调整,这个就能行了。这不是一个脚本请求网站,而是一个问答...看看编辑。 - giorgio
@giorgio - 这个评论不是我写的。我已经点赞了他的回复...即使有误解,我还是很感激 :) - Pr0no
为了您的诚实,我们将免费升级一次 ;) if($j <= $i) break; 现在是 if($j <= $i) break;(否则'A' => 'A'这对键值对将不会显示) - giorgio

1

这在PHP中是不可能的,因为PHP数组只能有唯一的键。

你可以得到输出

$output = array(
  'A' => array('B','C','D'),
  'B' => array('C','D')
);

$input = array('A', 'B', 'C', 'D');
foreach($input as $key => $value){
   $tempKey = $key;
   for($key +1 ; $key < count($input) ; $key++){
      $result[$tempKey][] = $input[$key];
   }
}

没错。这将是一个更好的选择。 - Pr0no

0
您可以使用这个通用的方法:
function combine($inputArray, &$outputArray, $index, $combLen) {
        global $outstr;
        for ($i = $index; $i < count($inputArray); $i++) {
                $outstr.=$inputArray[$i];
                if(strlen($outstr) == $combLen) {
                        $outputArray[]= $outstr;
                }
                combine($inputArray, $outputArray, $i + 1, $combLen);
                $outstr = substr($outstr, 0, strlen($outstr)-1);
        }
}

在ideone上查看


0

如果你需要像数组一样处理成对数据

$pairs = [];
foreach($a as $k => $v) {
    foreach(array_slice($a, $k + 1) as $k2 => $v2) {
        $pairs[] = [$v, $v2];
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接