2017-05-17 17 views
1

私はできるだけ多くを割り当てると同時に、最高の一意のマッチを返す方法を考え出すことにいくつかの困難を抱えています。データを一意にマッチさせ関連付ける方法は?

シナリオ:各子供に個人的なスコアのお気に入りの果物のリストがあります。各果物は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しばらくによってソートすることができ、単純な2次元配列にあなたの入力を平坦化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 - 子供の場合彼らの最初の選択肢、2番目の選択肢、などを得た - 私はそれを構築することができますが、それはメソッドの複雑さのより高いレベルを作成します。この出力で十分かどうかを教えてください。 – mickmackusa

関連する問題