2016-07-20 1 views
1

배열의 키 값 쌍을 비교하여 다음 키 값 쌍을 비교하여 더 낮은 값을 찾습니다. 설정을 취소하고 앞으로 나아가 야합니다. 그러나 정확성을 얻지 못하고 있습니다. 여기서 잘못하고있는 것이 무엇입니까? 제안하십시오. 코드가 있습니다. 이것은 비교되고 평가 될 배열입니다. 상기 어레이에서 배열을 탐색하고 현재 키 값 쌍을 다음 하나의 PHP와 비교하십시오

Array 
(
[0] => Array 
    (
     [com_details] => Array 
      (
       [spid] => 6 

      ) 

     [distance] => 13.1 mi 
    ) 

[1] => Array 
    (
     [com_details] => Array 
      (
       [spid] => 6 

      ) 

     [distance] => 66.2 mi 
    ) 

[2] => Array 
    (
     [com_details] => Array 
      (
       [spid] => 6 

      ) 

     [distance] => 1.5 mi 
    ) 

[3] => Array 
    (
     [com_details] => Array 
      (
       [spid] => 7 

      ) 

     [distance] => 188 mi 
    ) 

[4] => Array 
    (
     [com_details] => Array 
      (
       [spid] => 7 

      ) 

     [distance] => 96.7 mi 
    ) 

[5] => Array 
    (
     [com_details] => Array 
      (
       [spid] => 7 

      ) 

     [distance] => 3.1 mi 
    ) 

[6] => Array 
    (
     [com_details] => Array 
      (
       [spid] => 14 

      ) 

     [distance] => 1.8 mi 
    ) 

[7] => Array 
    (
     [com_details] => Array 
      (
       [spid] => 14 

      ) 

     [distance] => 228 mi 
    ) 

[8] => Array 
    (
     [com_details] => Array 
      (
       [spid] => 14 

      ) 

     [distance] => 82.2 mi 
    ) 

) 

난 그 SPID 동일하며 다음 또는 이전 거리는 다음 다른 하나가 설정되며 다음 iteration.But 위해 전진 적 으면 거리가 다른 것과 com_details 비교해야 이 종말점에 실패했습니다.

$l=0; 
    do{ 
     $length = count($dispatch_locations1); 
     if($length >= $l+1){ 
      if($dispatch_locations1[$l]['com_details']['spid'] == @$dispatch_locations1[$l+1]['com_details']['spid']){ 
       if($dispatch_locations1[$l]['distance'] > $dispatch_locations1[$l+1]['distance']){ 
        unset($dispatch_locations1[$l]); 
        $l--; 
        $dispatch_locations1 = array_values($dispatch_locations1); 
       } else if($dispatch_locations1[$l]['distance'] < $dispatch_locations1[$l+1]['distance']){ 
        unset($dispatch_locations1[$l+1]); 
        $l--; 
        $dispatch_locations1 = array_values($dispatch_locations1); 
     } else if($dispatch_locations1[$l]['distance'] == $dispatch_locations1[$l+1]['distance']){ 
        unset($dispatch_locations1[$l+1]); 
        $l--; 
        $dispatch_locations1 = array_values($dispatch_locations1); 
     } 
      } 
     } 
      $l++; 
     } while ($l <= count($dispatch_locations1)+1); 
    } 

전체 반복이 다소 틀린이 배열을 얻은 후에.

Array 
(
[0] => Array 
    (
     [com_details] => Array 
      (
       [spid] => 6 

      ) 

     [distance] => 1.5 mi 
    ) 

[1] => Array 
    (
     [com_details] => Array 
      (
       [spid] => 7 

      ) 

     [distance] => 188 mi 
    ) 

[2] => Array 
    (
     [com_details] => Array 
      (
       [spid] => 14 

      ) 

     [distance] => 1.8 mi 
    ) 

) 

이 결과에서 두 번째 배열 거리는 188로 잘못 반환됩니다.

여기에서 잘못된 것을 제안하십시오.

+0

I 생는 여기에 사용되는 샘플 ARRAY nk 당신이 문자열을 비교하려고하는 대신에 수레를 비교할 필요가 있습니다. 배열에 부동 소수점 키를 입력하거나 거리를 변환하려고 시도하십시오 – KoKo

+0

또한 do 대신에 usort를 사용할 수 있습니다. http://php.net /manual/en/function.usort.php – KoKo

+0

ok는 시도 할 것입니다. u는 usort를 구현하는 방법을 제안 할 수 있습니다. –

답변

1

귀하의 코드를 요약하십시오. 아래의 코드 조각은 방법을 보여줍니다. 그러나 시작하기 전에 & 자신을 테스트 해보십시오. here.

TESTING

<?php 

    $arrMain  = array(
     array(
      'com_details' => array('spid'=> 6), 
      'distance'  => "13.1mi", 
     ), 
     array(
      'com_details' => array('spid'=> 6), 
      'distance'  => "66.2 mi", 
     ), 
     array(
      'com_details' => array('spid'=> 6), 
      'distance'  => "1.5mi", 
     ), 
     array(
      'com_details' => array('spid'=> 7), 
      'distance'  => "188.0 mi", 
     ), 
     array(
      'com_details' => array('spid'=> 7), 
      'distance'  => "96.7 mi", 
     ), 
     array(
      'com_details' => array('spid'=> 7), 
      'distance'  => "3.1 mi", 
     ), 
     array(
      'com_details' => array('spid'=> 14), 
      'distance'  => "1.8 mi", 
     ), 
     array(
      'com_details' => array('spid'=> 14), 
      'distance'  => "228.0 mi", 
     ), 
     array(
      'com_details' => array('spid'=> 14), 
      'distance'  => "82.2 mi", 
     ), 
    ); 

알고리즘 위해 var_dump()의

<?php 
    $arrSections = array(); 

    // SORTING FUNCTION - USED TO SORT ARRAY VALUES BY "distance" 
    // IN DESCENDING ORDER... 
    function sortByField($prev, $next, $field="distance") { 
     $prevVal = floatval(preg_replace("#[a-zA-Z\s\t]*#", "",$prev[$field])); 
     $nextVal = floatval(preg_replace("#[a-zA-Z\s\t]*#", "",$next[$field])); 
     return $prevVal - $nextVal; 
    } 

    // BUNDLE ARRAYS WITH SIMILAR spid INTO ONE GROUP 
    // THUS CREATING A MULTI-DIMENSIONAL ARRAY WHOSE MAIN KEYS CORRESPOND TO 
    // THE spid OF MEMBER ARRAYS IN THE GROUP. 
    foreach($arrMain as $iKey=>$subMain){ 
     $spID = $subMain['com_details']['spid']; 
     $strID = $spID; 

     if(!array_key_exists($strID, $arrSections)) { 
      $arrSections[$strID] = array(); 
     } 
     $arrSections[$strID][] = $subMain; 
    } 

    // SORT THE ARRAY SIMPLY BY THE FIELD "distance" IN DESCENDING ORDER 
    array_walk($arrSections, function (&$data) { 
     usort($data, "sortByField"); 
    }); 

    // ARRAY THAT HOLDS THE DESIRED RESULT 
    $arrFinal = array(); 

    // WE KNOW THAT ONLY THE FIRST ITEM IN THE ARRAY IS OF IMPORTANCE TO US 
    // SO WE REMOVE ALL OTHER ITEMS EXCEPT THE 1ST... 
    foreach($arrSections as $intKey=>&$section){ 
     array_splice($section, 1); 
     $arrFinal[] = $section[0]; 

    } 
    var_dump($arrFinal); 

결과

// var_dump($arrSections); PRODUCES::: 
    array (size=3) 
     0 => 
     array (size=2) 
      'com_details' => 
      array (size=1) 
       'spid' => int 6 
      'distance' => string '1.5mi' (length=5) 
     1 => 
     array (size=2) 
      'com_details' => 
      array (size=1) 
       'spid' => int 7 
      'distance' => string '3.1 mi' (length=6) 
     2 => 
     array (size=2) 
      'com_details' => 
      array (size=1) 
       'spid' => int 14 
      'distance' => string '1.8 mi' (length=6) 
+0

이것을 구현할 것이다 ... –

+0

생성 된 추가 배열 즉, [6] => Array ... [7] => 배열 ... '등 –

+0

@SudhanshuSaxena 코드가이를 반영하도록 업데이트되었습니다. 유일한 변경 사항은 코드 맨 아래에 있습니다 : ** // 원하는 부분이 배열 된 배열 * 코드의 끝까지 *'$ arrFinal = array();'행운 & 건배 .... ;-) – Poiz

0

내가 제대로 여기에 문제를 얻는 경우는 그것을 해결하는 코드입니다 ..

이 코드는 먼저 SPID에 의해 이상의 거리에 의해 배열을 정렬 : 당신은에 의해 전체 복잡한 작업을 단순화 할 수

<?php 
usort($dispatch_locations1, function($a, $b) { 
    if($a['com_details']['spid'] > $b['com_details']['spid']) { 
     return 1; 
    } elseif($a['com_details']['spid'] < $b['com_details']['spid']) { 
     return -1; 
    } 

    return (floatval($a['distance']) < floatval($b['distance'])) ? -1 : 1; 
}); 
?> 
+0

나는 이것을 시도 할 것이다 –

관련 문제