2017-05-17 43 views
1

我在計算如何返回最佳唯一匹配時遇到一些困難,同時儘可能多地分配。如何匹配和關聯數據唯一?

情景:每個孩子都有一個擁有個人成績的最愛水果列表。我們每種水果只有一種,所以我們想把它給予最喜歡的孩子。如果某人得分較高,可以無果而生,但我們仍然希望儘可能多地結果。

預期的結果將是:

0 = [1] Apple 
1 = [0] Mango 
2 = [0] Banana 
3 = null 

這是我的輸入數組:

Array 
(
    [0] => Array 
     (
      [0] => Array 
       (
        [name] => Banana 
        [score] => 80.2 
       ) 
      [1] => Array 
       (
        [name] => Apple 
        [score] => 40 
       ) 
     ) 
    [1] => Array 
     (
      [0] => Array 
       (
        [name] => Mango 
        [score] => 70 
       ) 
      [1] => Array 
       (
        [name] => Banana 
        [score] => 40 
       ) 
     ) 
    [2] => Array 
     (
      [0] => Array 
       (
        [name] => Banana 
        [score] => 90 
       ) 
      [1] => Array 
       (
        [name] => Orange 
        [score] => 20 
       ) 
     ) 
    [3] => Array 
     (
      [0] => Array 
       (
        [name] => Mango 
        [score] => 60 
       ) 
     ) 
) 

回答

1

我的方法先整平你輸入一個簡單的二維數組允許將所有行被score而排序保留fruitchildid數據。排序後,所有行都會迭代(而不是迭代完整數組搜索),並且只會根據請求爲每個孩子存儲最喜歡的水果(如果可用)。

OP的輸入:

$input=[ 
      [['name'=>'Banana','score'=>80.2],['name'=>'Apple','score'=>40]], 
      [['name'=>'Mango','score'=>70],['name'=>'Banana','score'=>40]], 
      [['name'=>'Banana','score'=>90],['name'=>'Orange','score'=>20]], 
      [['name'=>'Mango','score'=>60]] 
     ]; 

方法:

$result=array_fill_keys(array_keys($input),null); // list all child ids and default to null 

// flatten input array for simple sorting and iteration 
foreach($input as $i=>$subarrays){ 
    foreach($subarrays as $a){ 
     $restructured[]=['score'=>$a['score'],'fruit'=>$a['name'],'childid'=>$i]; 
    } 
} 
rsort($restructured); // will sort the array by score DESC 

foreach($restructured as $a){ 
    if(is_null($result[$a['childid']]) && !in_array($a['fruit'],$result)){ 
     // only "fruitless" children wanting what is available 
     $result[$a['childid']]=$a['fruit']; 
    } 
} 

var_export($result); 

輸出:

array (
    0 => 'Apple', 
    1 => 'Mango', 
    2 => 'Banana', 
    3 => NULL, 
) 
+0

@Kristian如果有必要知道偏好#爲每一個孩子 - 如果孩子得到了他們的第一選擇,第二選擇等 - 我可以建立它,但是它會在方法中造成更高的複雜度。讓我知道這個輸出是否足夠。 – mickmackusa