2013-01-08 116 views
2

我对如何在3个PHP数组中找到所有“对”和“三元组”感到茫然。我的阵列是这样的:查找3个PHP数组之间的所有交集

Array 
(
    [0] => Array 
     (
      [sanitized] => lisa 
      [original] => Lisa 
      [weight] => 100 
      [color] => blank 
     ) 

    [1] => Array 
     (
      [sanitized] => jack 
      [original] => Jack 
      [weight] => 93 
      [color] => blank 
     ) 
    ... 

有3个这些数组;它们总是按整数键排序,并且它们总是包含10个索引(0-9)。我所试图做的是:

  • 找到名称相同的情况下(通过了“纯净的”场比较)无论是在阵列中的2个或所有3个阵列,并改变他们的“颜色”是相同的(即我不想找到所有3个阵列之间的交集 - 可以通过array_intersect来完成)
  • 构建第四个数组,将所有条目连接起来,并将相同的名称(通过比较“清理过的”字段)相加重量(颜色无关紧要)
  • 由于这些任务是相似的,所以我想在同一时间完成它们,并将复杂度降至最低

这很难解释,所以我用视觉表现了它。

颜色:

Colors http://www.tsiomenko.com/1.png

重量:

Weights http://www.tsiomenko.com/2.png

我有一定的工作代码,但它是很长的,丑陋的,并具有一些如N^3的复杂性 - 我使用嵌套for循环多次遍历所有的数组,直到我有我需要的。尽管我正在处理非常小的数组,但我想知道如何有效地完成这项工作,因为我很好奇别人会如何处理这个问题。欢迎使用伪代码来解决这个问题,而不是PHP。

+0

您如何确定条目的主色,例如你怎么知道当Lisa在数组1中具有“绿色”和数组2中的“黄色”时要设置哪种颜色?将选择哪种颜色?此外,在该示例中,颜色是“空白”。你从哪里得到颜色分配? – Gordon

+0

@戈登我不认为这很重要(它实际上只是'f(姓名)') - 在输出中,同一人(在3次输入中出现2/3次)有同色高光。 – 2013-01-08 06:56:22

+0

@戈登 - 只要每组相同名称都有自己的颜色,挑选的颜色就不重要了。现在我只是从预制数组中拉出一个随机颜色,然后确保颜色不会再被选中。还应该提到每个数组是一组(即,单个数组内的所有名称都是唯一的)。 – user1890572

回答

1

下面的循环应该给你需要的输出:

// loop once to build the combined array and set the colors 
foreach ($names as &$name) { 
    if (!isset($combined[$name['sanitized']])) { 
     $combined[$name['sanitized']] = array(
      'original' => $name['original'], 
      'weight' => $name['weight'], 
      'color' => array_pop($colors), 
      'count' => 1, 
     ); 
    } elseif ($combined[$name['sanitized']]['count'] < 3) { 
     $combined[$name['sanitized']]['weight'] += $name['weight']; 
     $combined[$name['sanitized']]['count']++; 
    } 

    $name['color'] = $combined[$name['sanitized']]['color']; 
} 


// loop again to blank any colors where name only appeared once 
foreach ($names as &$name) { 
    if ($combined[$name['sanitized']]['count'] === 1) { 
     $combined[$name['sanitized']]['color'] = $name['color'] = 'blank'; 
    } 
} 

我省略颜色发生器,为此也有不少SO问题在那里。有一点在这里仍然不清楚,如果发现超过3个匹配,该怎么办,因此您可能需要修改上述内容以满足您的需求。

Here's a Gisthere's the generated output

+0

正是我在找的东西 - 记住你有3个独立的“名称”数组,但我想通了。感谢您的非常彻底的回应! – user1890572