2016-08-22 11 views
-2

私は難しい作業に悩まされています。コードが非常に乱雑で、多くのforeachループがなければ解決できません。配列を整列して重複した値を削除する

これは基本的なロジックです:

だけ唯一の男がピザを持つことができるので、一つだけの男が、パスタなどを持つことができます。しかし、彼らは、複数の食品を持つことができ、配列内のユニークな食品が存在する場合があります。そして、配列の中で最も食べ物の多い人は、食糧の少ないものよりも食べ物を勝ち取るべきです。

Johnは、JoeまたはConnyのいずれかにhisがあるので、配列から削除する必要があります。

ジョーとコンニーは同じ量の食べ物を持っているので、そのうちの1つはすべての食品を保持し、もう1つは配列から削除する必要があり、ジョーかコニーかどうかはランダムに選択する必要があります。

開始配列は次のようになります。

Array 
(
    [Joe] => Array 
     (
      [0] => Pizza 
      [1] => Pasta 
      [2] => Lasagne 
      [3] => Tacos 
      [4] => Hamburger 
     ) 

    [Conny] => Array 
     (
      [0] => Pizza 
      [1] => Pasta 
      [2] => Lasagne 
      [3] => Tacos 
      [4] => Hamburger 
     ) 

    [John] => Array 
     (
      [0] => Pizza 
      [1] => Pasta 
     ) 

    [Fred] => Array 
     (
      [0] => Pizza 
      [1] => Pasta 
      [2] => Soup 
      [3] => Fish 
     ) 

    [Greg] => Array 
     (
      [0] => Sushi 
     ) 

) 

そして私が望む最終的な結果は次のとおりです。

Array 
(
    [Joe] => Array 
     (
      [0] => Pizza 
      [1] => Pasta 
      [2] => Lasagne 
      [3] => Tacos 
      [4] => Hamburger 
     ) 

    [Fred] => Array 
     (
      [2] => Soup 
      [3] => Fish 
     ) 

    [Greg] => Array 
     (
      [0] => Sushi 
     ) 

) 

配列にし、二つ以上の人が同じを持っている場合は左だけそう独特の食べ物それは、これらが食品を保持すべきかどうかを無作為に選ぶべきです。

どのように私はこれを行うことができますか?

+2

コードを表示します。これはちょうど配列です –

+0

私はかなり多くのコードを持っていないので、どこから始めたらいいのか分かりません。 – user1878980

答えて

2

uasortのユーザー定義関数を使用して、サブアレイ内の要素の数に応じて配列を逆順にソートする必要があります。次に、2つのforeachループを使用してループをループすることができます。ヘルパー変数を使用して、食品が既に使用されているかどうかを判断し、その場合はunset要素を使用します。その後、配列内の空の要素をarray_filterで除外します。

uasort($food, function($a, $b) { 
    return count($b) <=> count($a); 
}); 

$used = array(); 
foreach($food as $kl => $pl) { 
    foreach($pl as $k => $p) { 
     if(!in_array($p, $used)) { 
      $used[] = $p; 
     } else { 
      unset($food[$kl][$k]); 
     } 
    } 
} 
$food = array_filter($food); 

あなたがここでそれを見ることができます:https://3v4l.org/LjpGD

参考:
http://php.net/uasort
http://php.net/in_array
http://php.net/array_filter

PS:コードはspaceship operator利用できるPHP 7.0以降の新しいを使用しています。 PHP7を使用しない場合、または使用できない場合は、比較のために以下のようにif構造を使用する必要があります。

if(count($b) > count($a)) { 
    return 1; 
} elseif(count($b) == count($a)) { 
    return 0; 
} else { 
    return -1; 
} 
+0

ありがとうございました! 2人以上の男が同じ量の食べ物を食べている場合はランダムな要素を追加するには、そのうちの1つにランダムに優先順位を付ける必要があります。 – user1878980

+0

さて、あなたはランダムに配置されるように配列をシャッフルすることができます。そして、同じ量の最初のもの(または最後のものはPHPが優先するものであるかどうかわからないもの)は同じものの上にあります量)。 –

+0

ありがとうございました!それは多くの助けになりました! – user1878980

関連する問題