【问题标题】:Compare array items against other items in array one time将数组项与数组中的其他项进行一次比较
【发布时间】:2016-02-17 22:27:27
【问题描述】:

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

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

而且它必须只访问一次。我很迷茫如何让它发挥作用。任何帮助将不胜感激。

【问题讨论】:

  • 请提供您目前拥有的代码 - 这将帮助用户查明您的解决方案可能存在的问题。还要描述代码究竟如何未能实现您的目标。

标签: php


【解决方案1】:

你可以使用两个 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 循环这种行为会导致 foreach,实际上看起来是一个简单的for 循环,并且更慢。 使用foreach 根本没有任何好处。

【讨论】:

  • 就是这样!比你好多了。我想我需要一个内部循环,但我做错了。
  • @Philipp 祝贺 10k
  • 我投了反对票,因为这种方法不适用于字符串键数组。最好使用foreach而不是for,请看这个方法:stackoverflow.com/questions/33741890/…
  • @Julian - 1. assoc 数组不是作者的问题。 2. “更好”的方法不是作者想要的,因为它比较了[1,2][2,1]。如果您不能使用数字索引,您可以先将array_values 应用于$z,如果您还需要密钥,还有更多工作要做。但是仅仅使用foreach 是行不通的!
  • @Philipp 您对array_values() 的看法是正确的,但说foreach 不起作用是错误的。请看这里:stackoverflow.com/questions/33741890/…
【解决方案2】:

未测试,但类似:

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

【讨论】:

    【解决方案3】:
    <?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
    

    【讨论】:

      【解决方案4】:

      在我看来,使用foreach() 比使用for() 更好。

      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; 
      

      【讨论】:

      • 为什么案例 A 的差异很大?另外,基准在什么硬件上运行?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多