代码之家  ›  专栏  ›  技术社区  ›  robjmills

将数组拆分为唯一对

  •  5
  • robjmills  · 技术社区  · 14 年前

    假设我从一个简单的数组开始(理论上可以是任意长度):

    $ids  = array(1,2,3,4);
    

    将此数组拆分为唯一对数组的最佳解决方案是什么:

    $pair[0] = array(1,2);
    $pair[1] = array(1,3);
    $pair[2] = array(1,4);
    $pair[3] = array(2,3);
    $pair[4] = array(2,4);
    $pair[5] = array(3,4);
    
    6 回复  |  直到 14 年前
        1
  •  3
  •   Daniel Vandersluis    14 年前

    最简单的解决方案是使用嵌套循环并在运行时构建组合,尽管注意这里的复杂性是O(n) 2

    $ids = array(1,2,3,4,4);
    $combinations = array();
    
    $ids = array_unique($ids); // remove duplicates
    $num_ids = count($ids);
    
    for ($i = 0; $i < $num_ids; $i++)
    {
      for ($j = $i+1; $j < $num_ids; $j++)
      {
        $combinations[] = array($ids[$i], $ids[$j]);
      }
    }
    

    http://www.ideone.com/9wzvP

        2
  •  1
  •   armonge    14 年前

    可能不是最好的解决办法

    $ids  = array(1,2,3,4);
    
    $pairs = array();
    foreach($ids as $key => $data){
        foreach($ids as $subkey => $subdata){
            if( $subkey != $key){
                if(!in_array(array($subdata, $data) , $pairs) ){
                    $pairs[] = array($data, $subdata);
                }
            }
        }
    }
    

    不管怎样,它是有效的

        3
  •  1
  •   Nev Stokes    14 年前

    array_chunk()

    请尝试以下操作:

    $ids  = array(1, 2, 3, 4);
    $out = array();
    
    while ($item = array_shift($ids)) {
        foreach ($ids as $key=>$value) {
            $out[] = array($item, $value);
        }
    }
    
        4
  •  1
  •   Santiago Bustelo    14 年前

    我更改了while语句,以避免在其中一个值为0时循环中断:

    $ids  = array(0, 1, 2, 3, 4);
    $out = array();
    
    while ( !is_null( $item = array_shift($ids) )  ) {
        foreach ($ids as $key=>$value) {
            $out[] = array($item, $value);
        }
    
    }
    
        5
  •  0
  •   Ankur Saxena    12 年前
    $ids  = array(1,2,3,4);
    $result=array();
    foreach($ids as $value_1)
    {
      foreach($ids as $value_2)
      {
         if($value_1 !=$value_2)
         {
           $result[]=array($value_1,$value_2);
         }
       }
    }
    echo "<pre>";
    print_r($result);
    
        6
  •  -1
  •   SpacedMonkey    14 年前