2013-05-09 1 views
-3

동일한 컨테스트 ID를 공유하는 동영상 배열에서 2 개의 동영상을 가져 오려고합니다. 두 항목이 같은 값을 공유하는 한 컨테스트 ID가 무엇인지는 중요하지 않습니다. 이것은 쉬울 수도 있지만 내 두뇌가 튀기는 지점 중 하나에 있습니다. 나는 바베큐 냄새를 맡을 수있다. 롤.다차원 배열에서 동일한 컨테스트로 2 개 항목 선택

Array 
(
    [0] => Array 
     (
      [id] => 11 
      [filename] => 7966727971960279-4131736221448300-Adele_Set_Fire_to_the_Rain_Cover_by_Sara_Niemietz_ 
      [added] => 2013-05-06 08:50:34 
      [userId] => 14 
      [contestId] => 3 
      [complete] => 1 
     ) 

    [1] => Array 
     (
      [id] => 15 
      [filename] => 7090052934711575-3964279645504194-Adele_Set_Fire_To_The_Rain_cover_by_Sabrina 
      [added] => 2013-05-06 09:58:08 
      [userId] => 14 
      [contestId] => 4 
      [complete] => 1 
     ) 

    [2] => Array 
     (
      [id] => 14 
      [filename] => 6959153088629946-5656902896285110-Adele_Set_Fire_to_the_Rain_Cover_By_Public_School_Kids_Own_With_Guitar 
      [added] => 2013-05-06 09:42:10 
      [userId] => 14 
      [contestId] => 4 
      [complete] => 1 
     ) 

    [3] => Array 
     (
      [id] => 10 
      [filename] => 2795880037180269-1520875971490576-test 
      [added] => 2013-05-06 08:02:53 
      [userId] => 9 
      [contestId] => 3 
      [complete] => 1 
     ) 

    [4] => Array 
     (
      [id] => 12 
      [filename] => 6683752765687164-9656171421456902-Adele_Set_Fire_To_The_Rain_Arlene_Zelina_Cover_ 
      [added] => 2013-05-06 09:21:12 
      [userId] => 11 
      [contestId] => 3 
      [complete] => 1 
     ) 

    [5] => Array 
     (
      [id] => 13 
      [filename] => 6917133659214044-8729839283435145-Adele_Set_Fire_To_The_Rain_Boyce_Avenue_cover_on_iTunes_Spotify 
      [added] => 2013-05-06 09:34:50 
      [userId] => 12 
      [contestId] => 3 
      [complete] => 1 
     ) 

) 
+0

[당신은 시도 무엇?] (http://mattgemmell.com/2008/12/08/what-have-you-tried/) – jleft

+0

MySQL과 그 일을 시도하지만 어떻게 알아낼 수 없습니다 쿼리가 시작되기 전에 컨테스트 ID를 몰라도 컨테스트 ID가 일치하는 레코드 2 개를 가져옵니다. 현재 활성 상태 인 컨테스트 ID를 통해 세션 기반 솔루션 루핑을 시도했지만 부피가 크고 버그가있었습니다. –

+0

해당 기준과 일치하는 3 개 이상의 레코드가있을 수 있습니다. 반환 할 항목은 무엇입니까? 처음 2 개, 마지막 2 개, 무작위로, 다른 것? – jleft

답변

2

당신은 모든 요소가 같은 contestId를 공유 가진 부분 배열을 요소 배열에 저장할 수 :

$sorted = array(); 

foreach ($elements as $e) { 
    $sorted[$e['contestId']][] = $e; 
} 

print_r($sorted); 

편집

이 기능은 두 가지가 포함 된 배열을 줄 것이다 동일한 contestId을 갖는 요소. 발견되지 않으면 null입니다. 무작위로 표시하지 않으려면 shuffle() 전화를 제거하십시오.

function getElementsFromArray($elements, $numberOfElements = 2) { 
    shuffle($elements); // In case if you want different elements in each call 
    $sorted = array(); 

    foreach ($elements as $e) { 
     $contestId = $e['contestId']; 
     $sorted[$contestId][] = $e; 

     if (count($sorted[$contestId]) == $numberOfElements) 
      return $sorted[$contestId]; 
    } 

    return null;   
} 
+0

이것은 콘테스트 ID별로 비디오를 배열로 정렬합니다. 그러나 일치하는 배열 중 하나에서 2를 선택하는 방법을 알지 못합니다. 매번 제대로 작동하지 않는 것 같습니다. 특히 첫 번째 배열에는 1 개의 결과 만 있지만 두 번째, 세 번째, 네 번째 배열 등의 인스턴스에는 2 개의 비디오를 가져올 수있는 많은 결과가있었습니다. –

+0

제발 편집하십시오. –

+0

이것은 완벽하게 작동하며 솔루션을 가장 잘 이해합니다. 감사. –

1

여기 있습니다. 이렇게하면 반복되는 첫 번째 컨테스트 ID의 처음 두 동영상이 반환됩니다. 두 개 이상이 필요하거나 모든 반복 ID가 필요한 경우,이 템플릿을 요구 사항에 맞게 수정할 수 있다고 생각합니다.

<? 

$vidArr = array(); 
foreach($arr as $ar) 
{ 
    if(!array_key_exists($ar['contestId'],$vidArr)) 
    { 
     $vidArr[$ar['contestId']] = $ar['filename'];  
    } 
    else 
    { 
     echo "Found two videos '". $vidArr[$ar['contestId']] ."' and '".$ar['filename']."' for ContestID ".$ar['contestId']; 
     exit; 
    } 
} 
+0

너의 작품은 너무 btw 작품, 다른 좀 더 내 필요에 맞는. 진심으로 당신의 도움에 감사드립니다. 감사! –