2011-01-26 6 views
0

누구든지 도움이 될지 궁금합니다.PHP에서 2 차원 배열 정렬

저는 예를 들어 몇 가지 작업 항목이있는 2 차원 배열을 가지고 있습니다.

$portfolioItems [$i] = array('job' => $extra_job->field_value, 
     'mediaType' => $media_type->field_value, 'default' => $default->field_value 
    ); 

정렬하려고하는 요소를 표시하기 위해 배열을 단순화했습니다.

기본적으로이 목록은 결국 내가 미리보기/데이터 등

이 모두 잘 작동하지만 내가하고 싶은 것은 다음과 같은 특정 순서가 있습니다와 함께 사용하고있어 jfredcarousel를 채 웁니다;

미디어 유형에 텍스트 '영웅'이 포함되어 있으면 (이 경우 하나의 인스턴스로만 표시됨)이 바로 앞으로 이동하십시오.

다음 항목은 '기본'항목 집합으로 식별 된 일부 작업 항목이어야합니다. 그래서 아마 작업 번호를 '기본'으로 식별하고 '영웅'프로세스와 같이 확인하는 어딘가에 플래그를 설정할 것입니다.

그래서 '영웅'항목이 될 것이고, 그 다음 작업 번호 항목은 '기본값'으로 정의되며, 나머지는 순서대로 삭제됩니다 (이미 작업 번호로 항목을 정렬하고 있음).

exsiting 2 차원 배열을 정렬하는 가장 좋은 방법은 무엇입니까? Shift/Unshift 등을 살펴 보았지만 원하는 것을 얻을 수 없었습니다. 이제 배열을 복제 한 다음 하나씩이 조건을 검사하여 새로운 배열이 올바르게 보이는지 살펴 보겠습니다. 그런 다음 이전 배열을 삭제합니다.

어떤 생각이 사용 uasort

감사

답변

0

뭔가? :)

$finalItems = array(); 

for($i = 0; i < count($portfolioItems); $i++){ 
     if($portfolioItems[$i]['media_type'] == 'hero'){ 
     reindex($finalItems, 0); 
     $finalItems[0] = $portfolioItems[$i]; 
     } 
     else if($portfolioItems[$i]['default'] == true){ 
     reindex($finalItems, 1); 
     $finalItems[1] = $portfolioItems[$i]; 
     } 

     else { 
      if($i != 0 && $i != 1){ 
        reindex($finalItems, $i); 
        $finalItems[$i] = $portfolioItems[$i]; 
      } 
     } 
} 

function reindex(&$arr, $modifiedPosition){ 

for($i = 0; $i < count($arr); $i++){ 
    if($modifiedPosition <= $i){ 
    $arr[$i+1] = $arr[$i]; 

    if($i == $modifiedPosition){ 
    unset($arr[$i]); 
    } 

    } 

} 

} 
+0

고마워, 나는 그것을 줄 것이다. – frazzle

+0

은 테스트하지 않았지만, 제대로 작동하지 않는다고 말하면 문제를 해결하려고합니다. – usoban

+0

글쎄, 그것을 이전, 명확하게 작동하지 않을 것이라고, 하나는 그것을 업데이 트해야합니다. – usoban

2

을 감사하고 당신이 원하는 그 규칙을 구현 자신의 비교 함수를 작성합니다. 같은

뭔가 : 어쩌면 그런

function cmp($a, $b) { 
    if (strpos($a['mediaType'], 'hero') !== false && strpos($b['mediaType'], 'hero') === false) { 
     return 1; 
    } else if (strpos($a['mediaType'], 'hero') === false && strpos($b['mediaType'], 'hero') !== false) { 
     return -1; 
    } else if ($a['default'] == 1 && $b['default'] != 1) { 
     return 1; 
    } else if ($a['default'] != 1 && $b['default'] == 1) { 
     return -1; 
    } else { 
     return 1; 
    } 
} 

uasort($portfolioItems, 'cmp'); 
+0

건배 - 인덱스 배열 번호를 유지하면서 uasort를 사용하면 나중에이 배열을 통해 XML 파일을 고정시킬 수 있습니다. 색인 순서대로 되돌릴 수 있습니까? – frazzle

+2

아니요, uasort의 목적은 배열을 정렬 (순서를 변경)하는 것입니다. 항상 동일한 것은 아니기 때문에 색인 생성을 주문과 혼동하지 마십시오. 인덱스 연결을 유지할 필요가 없다면, 대신에'usort'를 사용할 수 있습니다. –

+0

Dan 감사합니다.이 문제를 해결하는 방법에 대해 살펴 보겠습니다. 이 배열은 2 차원 배열이므로 전체 배열의 모든 요소에 대해 foreach에이 함수를 사용해야합니다. 예 : uasort ($ portfolioItems [$ count], 'cmp'); – frazzle