将数组项与数组中的其他项进行一次比较


Compare array items against other items in array one time

我有一个PHP数组,里面有2-5个项目。

$z=["itema", "itemb", "itemc", "itemd","iteme"];

我需要有一种方法来遍历数组,并将每个项目相互匹配一次。所以输出看起来像

itema vs itemb
itema vs itemc
itema vs itemd
itema vs iteme
itemb vs itemc
itemb vs itemd
itemb vs iteme
itemc vs itemd...ect 

我似乎无法让循环击中每一个项目。我认为这必须是一个循环中的循环,因为我的一个循环不起作用。

而且它只需要去每一个地方一次。我不知道该如何让它发挥作用。任何帮助都将不胜感激。

您可以使用两个用于循环

$count = count($z);
for ($i = 0; $i < $count - 1; $i++) {
    for ($j = $i + 1; $j < $count; $j++) {
        // compare $z[$i] with $z[$j]...
    }
}

另一个循环从0到n-2,内部循环将外部值中的值作为初始值并进行到末尾。


如果您还需要处理关联数组,就像一位评论者提到的那样,您可以使用array_values(和array_keys)来处理这种情况。

$values = array_values($z);
$keys = array_keys($z); // optional - only used, if you need the keys..
$count = count($values);
for ($i = 0; $i < $count - 1; $i++) {
    for ($j = $i + 1; $j < $count; $j++) {
        // compare $values[$i] with $values[$j]...
        // or $keys[$i] with $keys[$j];
    }
}

注意:foreach循环在任何一种情况下都不起作用,因为您不能告诉内部循环跳过所有已在outher中看到的值环教foreach循环这种行为会导致foreach,实际上看起来像一个简单的for循环,更慢。使用foreach根本没有任何好处。

未测试,但类似于:

foreach($z as $item){
  foreach($z as $item2){
    if($item!=$item2){
      echo $item . ' vs ' . $item2;
    }
  }
}
<?php 
$z=["itema", "itemb", "itemc", "itemd","iteme"];
$sizeZ=count($z);
for ($i = 0; $i < $sizeZ-1; $i++) 
{
    for ($j = $i+1; $j < $sizeZ; $j++) 
    {
        echo $z[$i]." vs ".$z[$j]."<br>";
    }
}
?>

输出:

itema vs itemb
itema vs itemc
itema vs itemd
itema vs iteme
itemb vs itemc
itemb vs itemd
itemb vs iteme
itemc vs itemd
itemc vs iteme
itemd vs iteme

在我看来,与其使用for(),不如使用foreach()

foreach()的方法在我看来更干净。for()的方法没有错,但很奇怪。

参见带有foreach:的示例

$z = array('xxApple' => "itema", 'B' => "itemb", 'C' => "itemc", 'D' => "itemd", 'AAAA' => "iteme");
//$z = array("itema", "itemb", "itemc", "itemd", "iteme"); // works also with this array
$x = array_values($z);
$y = array_keys($z); // Optional
foreach($x as $key1 => $item){
  foreach($x as $key2 => $item2){
    if($key2 <= $key1){
        continue;
    }
    if($item == $item2){
        continue;
    }
    echo $item . ' vs ' . $item2 . '<br>';
    // echo $y[$key1] . ' vs ' . $y[$key2] . '<br>'; // Optional
  }
}

//OUTPUT
itema vs itemb
itema vs itemc
itema vs itemd
itema vs iteme
itemb vs itemc
itemb vs itemd
itemb vs iteme
itemc vs itemd
itemc vs iteme
itemd vs iteme

以下是基准结果:

基准#1

$z = range(0,20000);
$start = time();
$values = array_values($z);
for ($i = 0; $i < count($values) - 1; $i++) {
    for ($j = $i + 1; $j < count($values); $j++) {
    }
}
$end = time();                  
$elapsedTimeA = $end - $start;
// Case A, elapsed time in seconds: 275
echo 'Case A, elapsed time in seconds: ' . $elapsedTimeA; 

$start = time();
$x = array_values($z);
foreach($x as $key1 => $item){
  foreach($x as $key2 => $item2){
    if($key2 <= $key1){
        continue;
    }
    if($item == $item2){
        continue;
    }
  }
}
$end = time();                   
$elapsedTimeB = $end - $start;
// Case B, elapsed time in seconds: 103
echo 'Case B, elapsed time in seconds: ' . $elapsedTimeB; 

基准#2

$z = range(0,20000);
$start = time();
$values = array_values($z);
$count = count($values);
for ($i = 0; $i < $count - 1; $i++) {
    for ($j = $i + 1; $j < $count; $j++) {
    }
}
$end = time();                  
$elapsedTimeA = $end - $start;
// Case A, elapsed time in seconds: 17
echo 'Case A, elapsed time in seconds: ' . $elapsedTimeA;

$start = time();
$x = array_values($z);
foreach($x as $key1 => $item){
  foreach($x as $key2 => $item2){
    if($key2 <= $key1){
        continue;
    }
    if($item == $item2){
        continue;
    }
  }
}
$end = time();                   
$elapsedTimeB = $end - $start;
// Case B, elapsed time in seconds: 103
echo 'Case B, elapsed time in seconds: ' . $elapsedTimeB;