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

时间:2015-11-16 18:10:47

标签: php

我有一个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 

我似乎无法获得循环来击中每个项目。我认为它必须是一个循环循环,因为我只有一个循环不起作用。

它必须只去一次。我很失落如何让它发挥作用。任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:4)

你可以使用两个for循环

$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循环在任何一种情况下都不会起作用,因为你无法做到   告诉内循环跳过已在外部看到的所有值   环。并教导foreach循环此行为将导致a   foreach,有效看起来像一个简单的for循环而更慢。   使用foreach毫无益处。

答案 1 :(得分:1)

未经测试,但有类似的内容:

foreach($z as $item){
  foreach($z as $item2){
    if($item!=$item2){
      echo $item . ' vs ' . $item2;
    }
  }
}

答案 2 :(得分:0)

<?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

答案 3 :(得分:0)

我认为最好使用$percent = .....; //whatever the percentage you want to colour If ($percent <= 50) { $red = 255; $green = $percent * 5.1; } If ($percent >= 50) { $green = 255; $red = 255 - ($percent - 50) * 5.1; } $blue = 0; ,然后使用foreach()

使用for()的方法对我来说看起来更干净。使用foreach()的方法没有错,但这很奇怪。

查看带有for()的示例:

foreach

以下是基准测试结果:

基准#1

$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

基准#2

$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;