与数组中的所有其他项进行交互,但是只有一种方式?

时间:2019-03-09 17:59:46

标签: php

我在PHP中有一个数组。

它可能包含例如

$array = Array("A","B","C");

在PHP中,是否有任何一种简单的方法可以将每个元素与另一个元素进行一次交互(例如说串联)?

那么结果将是AB,AC,BC? (这只是简单的示例,我需要它来处理更大的示例)

1 个答案:

答案 0 :(得分:4)

类似的事情可能对您有用。它将遍历数组并获取一个元素。然后从当前元素的n + 1个元素(即$ j)开始再次遍历数组。实际上,在第二个循环中,您具有这两个元素的第一次交互作用,并且可以根据需要进行处理。

   function test(array $test)
      {
          $ret = [];
          for ($j = 0; $j < count($test); $j++) {
              for ($i = $j + 1; $i < count($test); $i++) {
                  $ret[] = $test[$j] . "->" . $test[$i];
              }
          }
          return $ret;
      }

然后

test(['A', 'B', 'C', 'D']);

会产生

array(6) {
    [0] => "A->B"
    [1] => "A->C"
    [2] => "A->D"
    [3] => "B->C"
    [4] => "B->D"
    [5] => "C->D"
}

要进行更精确的控制(例如,您要区分测试数组中的唯一名称(例如['A', 'B', 'C', 'A'],其中'A'不应使用两次),可以将{{1 }}数组关联数组,并使用$ret作为键。然后,您可以在第二个循环中检查$test[$j]中是否存在$test[$j],并根据该检查确定流程。

例如:

$ret

通过以下方式调用:

function test(array $test)
{
    $ret = [];
    for ($j = 0; $j < count($test); $j++) {
        if (!array_key_exists($test[$j], $ret)) {
            for ($i = $j + 1; $i < count($test); $i++) {
                if (!array_key_exists($test[$i], $ret)) {
                    $ret[$test[$j]][] = $test[$j] . "->" . $test[$i];
                }
            }
        }
    }
    return $ret;
}

会产生:

test(['A', 'B', 'C', 'D', 'A']);

最后,对于查找单向唯一路径的一种非常简单的方法:

array(3) {
  ["A"]=>
  array(3) {
    [0]=>
    string(4) "A->B"
    [1]=>
    string(4) "A->C"
    [2]=>
    string(4) "A->D"
  }
  ["B"]=>
  array(2) {
    [0]=>
    string(4) "B->C"
    [1]=>
    string(4) "B->D"
  }
  ["C"]=>
  array(1) {
    [0]=>
    string(4) "C->D"
  }
}

通过以下方式调用:

function test(array $test)
{
    $ret = [];
    for ($j = 0; $j < count($test); $j++) {
        $firstElement = $test[$j];
        # if this element doesn't exists as a key in the return array,
        # then we haven't encountered it yet
        if (!array_key_exists($firstElement, $ret)) {
            for ($i = $j + 1; $i < count($test); $i++) {
                $secondElement = $test[$i];

                # shouldn't have a path to itself?
                if ($firstElement === $secondElement) {
                    continue;
                }
                # make sure that the second element doesn't already exist as a key in the
                # return array...in which case we've already encountered this path
                if (!array_key_exists($secondElement, $ret)) {
                    $ret[$firstElement][$secondElement] = $firstElement . "->" . $secondElement;
                }
            }
        }
    }
    return $ret;
}

将返回:

test(['A', 'B', 'B', 'D', 'A', 'C', 'A', 'D', 'B']);