2017-10-02 1 views
0

PHP 유형의 저글링을 실험하고 있었는데 설명 할 수없는 유별난 동작을 발견했습니다. 나는 때로는 문자열 인 속성을 기반으로 객체를 정렬하려고했습니다. usort를 사용하면 일부 항목이 제 위치에서 벗어납니다. 나는 이유를 알 수 없다. PHP 7.0.16을 사용하고 있습니다.문자열과 숫자를 PHP로 정렬합니다.

class Classe { 
    protected $data = array(); 
    public function Set($chave, $valor) { 
     $this->data[$chave] = $valor; 
    } 
    public function Get($chave) { 
     return $this->data[$chave]; 
    } 
} 
$objetos = array(); 
$nomes = array('Joao', 'Jose', 'Lucas', 'Antonio', 'Miguel', 'Arthur', 'Davi', 'Bernardo', 'Heitor', 'Gabriel'); 
$posicoes = array(7, '8.2', '9', 1.0, '5', 1.1, '3.2', '2', '4', 4.2); 
for ($i = 0; $i < 10; ++$i) { 
    $objeto = new Classe; 
    $objeto->Set('pos', $posicoes[$i]); 
    $objeto->Set('nome', $nomes[$i]); 
    $objetos[] = $objeto; 
} 
foreach ($objetos as $o) { 
    echo "{$o->Get('pos')}: {$o->Get('nome')}\n"; 
} 
echo "\nAfter sorting:\n"; 
usort($objetos, 
    function($a, $b) { 
     return $a->Get('pos') - $b->Get('pos'); 
    }); 

foreach ($objetos as $o) { 
    echo "{$o->Get('pos')}: {$o->Get('nome')}\n"; 
} 

순서 정렬 후 :

1 : 안토니오 1.1 : 아서 2 베르나르 3.2 다비 4 Heitor 5 : 미겔 4.2 가브리엘 7 : 아오 8.2 : Jose 9 : 루카스

공지 사항 아이템 4.2와 5의 순서가 어긋났습니다. 왜 그런가요?

답변

1

문제는 float 값입니다. 당신이 documentation 읽는다면 당신은 발견 할 것이다 : 첫 번째 인수는 각각, 이하 동일, 또는보다 큰 것으로 간주되는 경우

비교 기능은 같거나보다 큰 제로보다 작은 정수 반환해야합니다 두번째.

그리고

: 같은 float로서 비교 함수에서

주의 반환이 아닌 정수 값은, 콜백의 반환 값의 정수로 내부 캐스트가 발생합니다. 따라서 0.99와 0.1 같은 값은 모두 0의 정수 값으로 형변환되며,이 값은 같은 값을 같은 것으로 비교합니다.

0

SPL (http://php.net/manual/en/array.sorting.php)에서 사용할 수있는 배열 정렬 옵션을 살펴볼 필요가 있습니다. 영숫자를 사용하여 값순으로 정렬하고 키/값 연관을 신경 쓰지 않습니다. 그것은 정말로 우리의 선택을 열어줍니다.

usort(...) 대신 다른 배열 정렬 옵션을 사용해보십시오. 나는 분류되지 않은 정렬 패턴을 발견하려고한다.

관련 문제