itsource

strcmp는 PHP의 정수(intcmp)와 동등합니다.

mycopycode 2023. 1. 19. 07:09
반응형

strcmp는 PHP의 정수(intcmp)와 동등합니다.

그래서 우리는 이 기능을 PHP에서 얻었습니다.

strcmp(string $1,string $2) // returns -1,0, or 1;

단, intcmp()는 없습니다.그래서 다음 중 하나를 작성했습니다.

function intcmp($a,$b) {
    if((int)$a == (int)$b)return 0;
    if((int)$a  > (int)$b)return 1;
    if((int)$a  < (int)$b)return -1;
}

그냥 지저분하게 느껴져요.다들 어떻게 생각하세요?

이는 전달된 순서 값을 기준으로 Javascript를 정렬하는 클래스의 일부입니다.

class JS
{
    // array('order'=>0,'path'=>'/js/somefile.js','attr'=>array());
    public $javascripts = array(); 
    ...
    public function __toString()
    {
        uasort($this->javascripts,array($this,'sortScripts'));
        return $this->render();
    }
    private function sortScripts($a,$b)
    {
        if((int)$a['order'] == (int)$b['order']) return 0;
        if((int)$a['order'] > (int)$b['order']) return 1;
        if((int)$a['order'] < (int)$b['order']) return -1;
    }
    ....
}

데이터 정렬 방법:

function sortScripts($a, $b)
{
    return $a['order'] - $b['order'];
}

역순서를 원할 경우 $b-$a를 사용합니다.

문제의 숫자가 PHP의 정수 범위를 초과할 경우,return ($a < $b) ? -1 : (($a > $b) ? 1 : 0)보다 견고합니다.

추가 정보로서만 이 RFC(https://wiki.php.net/rfc/combined-comparison-operator))가 인정되고 있습니다.

따라서 비교 함수는 ...과 비슷합니다.

<?php
$data = [...];
usort($data, function($left, $right){ return $left <=> $right; });
?>

여기에서는 다른 모든 비교와 동일한 방법으로 비교가 수행된다는 점이 매우 좋습니다.그래서 활자 저글링은 예상대로 일어날 것이다.

현시점에서는 오브젝트가 비교값을 표시할 수 있는 매직 __forCompare() 메서드는 없습니다.현재의 제안(다른 RFC)은 비교 중에 각 오브젝트를 다른 오브젝트에 삽입하여 비교가 이루어지도록 하는 것입니다.이것에 의해, 재귀나 스택 오버플로의 가능성이 있습니다.! 비교용으로 오브젝트의 타입을 삽입하거나(개체를 허가하거나) 어느쪽인가를 생각할 수 있습니다.비교 유형에 따라 적절한 값을 나타낼 수 있는 능력) 또는 비교 대상이 제공할 수 있는 값에 대한 블라인드 요청이 더 안전한 해결책이었을 것입니다.

아직 PHP-NG(현재는 PHP 7)에 통합되지 않았지만 곧 통합될 것으로 예상됩니다.

사용할 수 있습니다.

function intcmp($a,$b)
    {
    return ($a-$b) ? ($a-$b)/abs($a-$b) : 0;
    }

이 기능을 사용하는 이유는 전혀 모르겠습니다만,

왜 바퀴를 재창조하는 거죠?http://php.net/manual/en/function.strnatcmp.php

echo strnatcmp(1, 2) . PHP_EOL; // -1
echo strnatcmp(10, 2) . PHP_EOL; // 1
echo strnatcmp(10.5, 2) . PHP_EOL; // 1 - work with float numbers
echo strnatcmp(1, -2) . PHP_EOL; // 1 - work with negative numbers

테스트: https://3v4l.org/pSANR

꼭 +1과 -1이어야 하나요?그렇지 않으면 그냥 돌아오세요.(int) $a - (int) $b다른 사람이 추천한 분할이 마음에 들지 않으며, 세 가지 경우 모두 확인할 필요가 없습니다.더 크거나 같지 않으면 더 작아야 합니다.

return (int) $a > (int) $b ? 1 : (int) $a == (int) $b ? 0 : -1;

언뜻 보면 지저분한 느낌이 들어요.하지만 당신이 그걸 쓴 이유가 분명 있을거에요. 단지 실제를 사용하는 대신요.==,>,그리고.<오퍼레이터.이 기능을 만든 동기는 무엇입니까?

나라면 아마 이렇게 했을 거야

$x = $a==$b ? 0 : ($a>$b ? 1 : ($a<$b ? -1 : null));

나도 이게 못난 짓이란 걸 알아: null;로 하는지, 할 수 하지 않다 - PHP는 그것을 필요로 하는지, 나는 단지 할 수 있었다.:;!!!!!!!!!!!원래 요구 사항을 알고 있으면 훨씬 덜 혼란스러울 것 같아요!

문자열의 경우

 usort($points, function ($a, $b) use ($orderFlag, $key1, $key2) {
        return strcmp($a[$key1][$key2], $b[$key1][$key2]) * $orderFlag;
    });

orderFlag = > 1 (수직): -1 (내림차순)

숫자의 경우

usort($points, function ($a, $b) use ($orderFlag, $key1, $key2) {
    return ($a[$key1][$key2] - $b[$key1][$key2]) * $orderFlag;
});

orderFlag = > 1 (수직): -1 (내림차순)

언급URL : https://stackoverflow.com/questions/2852621/strcmp-equivelant-for-integers-intcmp-in-php

반응형