2016-08-22 12 views
-2

많은 foreach 루프가있는 코드를 사용하지 않으면 해결할 수없는 까다로운 작업이 있습니다.배열을 배열하고 중복 값을 삭제하십시오.

만 그래서 단 하나의 남자가 피자를 가질 수, 배열의 고유 한 음식이있을 수있다, 단 하나의 사람은 파스타 등을 할 수 있습니다하지만 여러 음식을 가질 수 있습니다

이 기본 논리이다. 그리고 배열에있는 대부분의 음식을 가진 녀석은 음식을 적게 먹는 사람들보다 음식을 이기어야합니다.

그래서 Joe 또는 Conny가 그의 John을 갖기 때문에 John은 배열에서 삭제되어야합니다.

그리고 Joe와 Conny는 같은 양의 음식을 먹고 있기 때문에 그 중 하나는 음식을 모두 지키고 다른 하나는 배열에서 삭제해야하며 Joe 또는 Conny인지 여부에 관계없이 무작위로 선택해야합니다.

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과 함께 사용자 정의 함수를 사용하여 하위 배열의 요소 수에 따라 배열을 역순으로 먼저 정렬해야합니다. 그런 다음 두 개의 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

정말 고마워요! 랜덤 팩터를 추가하려면 어떻게해야합니까? 두 명 이상의 사람이 같은 양의 음식을 먹으면 그 중 하나에 무작위로 우선 순위를 지정해야합니다. – user1878980

+0

글쎄, 배열을 임의로 배치하기 전에 배열을 섞어서 같은 양의 첫 번째 (또는 마지막 하나는 PHP가 선호하는 것이 확실하지 않음)와 같은 양을 맨 위에 놓을 수 있습니다 양). –

+0

대단히 감사합니다! 그것은 많은 도움이되었습니다! – user1878980

관련 문제