2013-01-08 90 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