2014-06-22 2 views
1

여기에서 다루는 데 문제가 있습니다 (코드 99 %의 논리 오류). 난 그걸 고칠 방법을 찾지 못하는 것 같지만, 당신 중 한 명이 시간 문제를 찾을 것입니다!배열을 정렬하는 사용자 정의 스크립트와 관련된 문제 오름차순 및 내림차순

오름차순 또는 내림차순으로 전달 된 배열을 정렬하는 함수를 만들어야하지만 배열 정렬 함수는 사용할 수 없습니다!

저는 지금까지 루프로 어려움을 겪어 왔습니다. 마침내 다른 개발자 (당신)에게 도움을 요청하고 싶습니다.

현재 오름차순 코드 만 작업 중이므로 내려 가기는 아무런 문제가되지 않습니다. 그것은 약간의 포인트까지 값을 정렬하지만, 다음으로 멈 춥니 다. (다음으로 작은 값이 전달 된 배열의 끝 부분에 있으면 중지됩니다.) 이 문제를 방지하고 전체 배열을 정렬하고 요소로 만들려면 어떻게해야합니까?

여기까지 코드가 있습니다.

<?php 

function order_array($array,$mode = 'ascending') { 

    $length = count($array); 

    if($mode == 'descending') {  
     return $array; 
    } else { 

     $sorted_array = array(); 
     $used_indexes = array(); 

     for($i = 0; $i < $length; $i++) { 
      $smallest = true; 

      echo $array[$i] . '<br/>'; 
      for($y = 0; $y < $length; $y++) { 

       //echo $array[$i] . ' > ' . $array[$y] . '<br/>'; 
       // if at ANY time during checking element vs other ones in his array, he is BIGGER than that element 
       // set smallest to false 
       if(!in_array($y,$used_indexes)) { 
        if($array[$i] > $array[$y]) { 
         $smallest = false; 
         break; 
        } 
       } 
      } 

      if($smallest) { 
       $sorted_array[] = $array[$i]; 
       $used_indexes[] = $i; 
      } 

     } 

     return $sorted_array; 
    } 
} 

$array_to_sort = array(1, 3, 100, 99, 33, 20); 
$sorted_array = order_array($array_to_sort); 
print_r($sorted_array); 

?> 
+1

내 게시물을 읽었습니까? 나는 당신이 알지 못했기 때문에 비례적인 질문을했습니다. 그것은 분명히 NO 배열 정렬 함수는 – DevGuy

+0

괜찮아요, sory하지만 당신은 정렬 오름차순을 유지할 수 있습니다 그리고 배열을 끝에서 첫 번째 요소 (카운트를 사용) –

+0

줄 수있는 당신이 내게이 일을해야 할 것이라고 예를 줄 수 있습니까? 또는 논리적 오류가있는 코드의 일부를 가리키고 있습니까? – DevGuy

답변

1

나는 완전히 다른 수행하여 문제를 스스로 해결했습니다. 이제 전달 된 배열의 모든 요소를 ​​올바르게 정렬합니다. 논리적 인 문제는 for() 루프를 사용하는 것이 었습니다. for() 루프는 set (전달 된 배열의 길이)만큼의 횟수 만 실행했지만, 새로운 루프는 정렬 된 새 배열이 오름차순으로 나올 때까지 반복해야하기 때문에 for 루프는 그 이상으로 반복해야합니다. 다음은 작동 할 코드입니다.

function order_array($array,$mode = 'ascending') { 

    if($mode == 'descending') { 

     // for() wont work here, since it will only loop an array length of times, when we would need it 
     // to loop more than that. 
     while(count($array)){ 
      $value = MAX($array); 
      $key = array_search($value, $array); 

      if ($key !== false) { 
       unset($array[$key]); 
      } 
      $sorted[] = $value; 
     } 

     return $sorted; 

    } else { 

     // for() wont work here, since it will only loop an array length of times, when we would need it 
     // to loop more than that. 
     while(count($array)){ 
      $value = MIN($array); 
      $key = array_search($value, $array); 

      if ($key !== false) { 
       unset($array[$key]); 
      } 
      $sorted[] = $value; 
     } 


     return $sorted; 
    } 
} 
0
function order_array($array,$mode = 'ascending') { 

    $length = count($array); 



     $sorted_array = array(); 
     $used_indexes = array(); 

     for($i = 0; $i < $length; $i++) { 
      $smallest = true; 

      echo $array[$i] . '<br/>'; 
      for($y = 0; $y < $length; $y++) { 

       //echo $array[$i] . ' > ' . $array[$y] . '<br/>'; 
       // if at ANY time during checking element vs other ones in his array, he is BIGGER than that element 
       // set smallest to false 
       if(!in_array($y,$used_indexes)) { 
        if($array[$i] > $array[$y]) { 
         $smallest = false; 
         break; 
        } 
       } 
      } 


      if($smallest) { 
       $sorted_array[] = $array[$i]; 
       $used_indexes[] = $i; 
      } 


     if($mode == 'descending') { 

      return array_reverse($sorted_array); 
     } 

     return $sorted_array; 
    } 
} 
+0

고마워, 내게 '내림차순'모드로 도움이 될 것입니다,하지만 당신은 내 문제를 이해하지 못했습니다 :) 나는 내림차순으로 그것을하는 법을 아는 것이 중요합니다. ASCENDING 모드에서 수행 한 코드는 전달 된 배열 요소를 모두 정렬하지 않습니다. 텍스트 편집기에서 해보면 내가 무엇을 의미하는지 알 수 있습니다. – DevGuy

+0

ok, 내 말은 desc 또는 asc의 경우 한 번만 개발해야하고 다른 옵션은 역순으로 반환하는 것입니다. –

+0

나는 그것을 이해합니다. 오름차순 모드의 코드를 실행 해보십시오. 올바르게 작동 시키는데 문제가 있습니다. – DevGuy

관련 문제