PHP 프로그래밍에서 Ceil () 함수는 종종 부동 소수점 번호를 반올림하고 주어진 값보다 최소 정수 값을 반환하는 데 사용됩니다. 언뜻보기에는 Ceil () 의 결과를 배열 인덱스로 사용하는 것이 합리적으로 보입니다. 정수를 반환하는 것이 보장되기 때문에 실제로이 관행은 때때로 예기치 않은 문제로 이어질 수 있습니다. 이 기사는 CEIL () 결과를 배열 인덱스로 직접 사용하는 것이 잘못된 이유를 깊이 탐색하고 해당 솔루션을 제공합니다.
Ceil () 함수의 수학적 의미는 반올림하는 것이지만 PHP에서는 반환 값 유형이 정수 가 아닌 플로트입니다. 간단한 예를 들기 위해 :
<?php
$val = 3.1;
$index = ceil($val);
var_dump($index); // float(4)
var_dump(gettype($index)); // string(5) "double"
?>
반환 된 인덱스는 정수 4가 아닌 부동 소수점 4.0 입니다.
부동 소수점 번호를 배열의 키로 사용하면 PHP는 부동 소수점 번호를 자동으로 정수로 변환하지만이 변환은 때때로 예기치 않은 문제를 일으킬 수 있습니다.
<?php
$array = [];
$array[ceil(1.2)] = 'a';
$array[4.0] = 'b';
var_dump($array);
?>
출력 결과 :
array(2) {
[2]=>
string(1) "a"
[4]=>
string(1) "b"
}
괜찮은 것처럼 보이지만 인덱스에 1.999999999999999999 와 같은 정수에 가까운 부동 소수점 번호가 포함되어 있으면 인덱스 혼동이나 덮어 쓰기가 발생할 수 있습니다.
플로팅 포인트 계산에는 정밀 오차 문제가 있는데, 이는 Ceil () 의 결과가 이론적으로 정수 값이더라도 정수에 매우 가까운 부동 소수점 번호로 이어져 배열 인덱싱에 혼란을 초래합니다.
<?php
$value = 2.9999999999999996;
$index = ceil($value); // 이론적으로는입니다3
var_dump($index); // 아마도 float(3) 그러나 내부 성능은 일관성이 없습니다
$array = [];
$array[$index] = 'value1';
$array[3] = 'value2';
var_dump($array);
?>
때로는 $ array [$ index] 와 $ array [3]가 다른 키로 간주되므로 데이터 혼동이 발생합니다.
가장 안전한 방법은 CEIL () 결과를 사용할 때 플로팅 포인트 숫자를 정수로 명시 적으로 변환하여 핵심 유형이 정확하고 일관되도록 배열 인덱스를 만들 수 있습니다.
<?php
$val = 3.1;
$index = (int) ceil($val);
$array = [];
$array[$index] = 'value';
var_dump($array);
?>
이것은 암시 적 변환의 가능한 부작용을 피합니다.
URL에서 숫자 매개 변수를 얻고 인덱스로 반올림해야한다는 요구 사항이 있다고 가정합니다.
<?php
$url = 'http://m66.net/path?num=2.7';
parse_str(parse_url($url, PHP_URL_QUERY), $query);
$num = $query['num'];
$index = (int) ceil($num);
$array = [];
$array[$index] = 'some value';
print_r($array);
?>
Ceil ()은 정수가 아닌 부동 소수점 번호를 반환합니다.
플로팅 포인트 숫자를 사용할 때 PHP 배열 키는 자동으로 변환되지만 정확도 오류의 숨겨진 위험이 있습니다.
CEIL () 결과를 색인으로 직접 사용하면 데이터를 덮어 쓰거나 인덱스 혼동을 일으킬 수 있습니다.
Ceil () 결과를 배열 인덱스로 사용할 때 (int) 변환을 명시 적으로 사용하여 인덱스 유형이 정수인지 확인하는 것이 좋습니다.
CEIL ()의 반환 유형 () 및 배열 키에 대한 PHP의 처리 규칙에 대한 올바른 이해는 코드의 잠재적 인 숨겨진 위험을 피하고보다 강력하고 신뢰할 수있는 프로그램을 작성할 수 있습니다.