답변:
예. 문자열은 문자형 배열로 볼 수 있으며 배열의 위치에 액세스하는 방법은 []
연산자 를 사용하는 것 입니다. 일반적으로 사용하는 데 전혀 문제가 없습니다 $str[0]
(그리고 substr()
방법 보다 훨씬 빠릅니다 ).
두 가지 방법 모두 한 가지주의 사항이 있습니다 . 첫 번째 문자가 아닌 첫 번째 바이트 를 얻습니다 . 멀티 바이트 인코딩 (예 : UTF-8)을 사용하는 경우 중요합니다. 이를 지원하려면을 사용하십시오 . 요즘에는 항상 멀티 바이트 입력을 가정해야하므로 이것이 최선의 선택이지만 약간 느려질 것입니다.mb_substr()
mb_substr($str, 0, 1, 'utf-8')
멀티 바이트 문자열을 자르지 않도록 해야 합니다.
substr($str, 0, 1)
코드를 읽는 사람을 혼란스럽게합니다.
{} 구문은 PHP 5.3.0부터 더 이상 사용되지 않습니다. 대괄호가 권장됩니다.
Note: Strings may also be accessed using braces, as in $str{42}, for the same purpose. However, this syntax is deprecated as of PHP 5.3.0. Use square brackets instead, such as $str[42].
Note: Strings may also be accessed using braces, as in $str{42}, for the same purpose.
그들이 사용하는 결정 만약 내가 궁금하네요 그래서 {}
PHP 6으로 더 이상 사용되지되지 않습니다
The curly-brackets-string-index-accessor-syntax does not emit any deprecation notice, although the original notice have been on and off for PHP 5.x, it does not in the current version, thrus we should not label it as deprecated. Related to bug #52254
- svn.php.net
Note: Strings may also be accessed using braces, as in $str{42}, for the same purpose.
이 구문은 잠시 동안 머물 것처럼 보인다.
$ _POST의 일부에서 첫 번째 문자를 원한다고 가정하고 'type'이라고 부를 수 있습니다. 그리고 그 $ _POST [ 'type']은 현재 'Control'입니다. 당신은 사용이 경우 경우 경우 $_POST['type'][0]
, 또는 substr($_POST['type'], 0, 1)
당신은 얻을 것이다 C
다시.
클라이언트 측 그들은에서 보내 데이터 수정했다 그러나, type
에 type[]
, 예를 들어를, 다음이 배열의 데이터로 '제어'와 '테스트'를 보내, $_POST['type'][0]
지금 돌아갑니다 Control
보다는 C
반면 substr($_POST['type'], 0, 1)
단순히 실패합니다.
따라서을 사용하는 데 문제가있을 수 $str[0]
있지만 주변 환경에 따라 다릅니다.
if (true === is_string($_POST['type']))
리소스에 따라 다를 수 있지만 스크립트를 실행하여 직접 볼 수 있습니다.)
<?php
$tests = 100000;
for ($i = 0; $i < $tests; $i++)
{
$string = md5(rand());
$position = rand(0, 31);
$start1 = microtime(true);
$char1 = $string[$position];
$end1 = microtime(true);
$time1[$i] = $end1 - $start1;
$start2 = microtime(true);
$char2 = substr($string, $position, 1);
$end2 = microtime(true);
$time2[$i] = $end2 - $start2;
$start3 = microtime(true);
$char3 = $string{$position};
$end3 = microtime(true);
$time3[$i] = $end3 - $start3;
}
$avg1 = array_sum($time1) / $tests;
echo 'the average float microtime using "array[]" is '. $avg1 . PHP_EOL;
$avg2 = array_sum($time2) / $tests;
echo 'the average float microtime using "substr()" is '. $avg2 . PHP_EOL;
$avg3 = array_sum($time3) / $tests;
echo 'the average float microtime using "array{}" is '. $avg3 . PHP_EOL;
?>
일부 참조 번호 (이전 CoreDuo 시스템)
$ php 1.php
the average float microtime using "array[]" is 1.914701461792E-6
the average float microtime using "substr()" is 2.2536706924438E-6
the average float microtime using "array{}" is 1.821768283844E-6
$ php 1.php
the average float microtime using "array[]" is 1.7251944541931E-6
the average float microtime using "substr()" is 2.0931363105774E-6
the average float microtime using "array{}" is 1.7225742340088E-6
$ php 1.php
the average float microtime using "array[]" is 1.7293763160706E-6
the average float microtime using "substr()" is 2.1037721633911E-6
the average float microtime using "array{}" is 1.7249774932861E-6
[]
또는 {}
연산자 를 사용하는 것은 다소 동일합니다.
testA
그리고 testB
당신은 사실 예 검출 할 수있는 것과 동일한 루프 수단 내에서 testB
하는 동안 캐시 살인자 testA
캐시 친화적이다. 둘 다 동일한 루프에 있으면 testB
오염 된 testA
캐싱 때문에 타이밍이 매우 동일한 것으로 측정됩니다 .
microtime()
전화를하는 데 걸리는 시간이 대부분의 시간 차이를 차지할 것이라고 걱정했습니다. 사실이 아닙니다), 여기서 작은 속도 차이에 신경 쓸 이유가 없습니다. 그것은 백만 분의 1 초의 일부입니다. 이것이 언제 문제가 될까요?
$str = 'abcdef';
echo $str[0]; // a
멀티 바이트 (유니 코드) 문자열을 사용 str[0]
하는 경우 문제가 발생할 수 있습니다. mb_substr()
더 나은 솔루션입니다. 예를 들면 다음과 같습니다.
$first_char = mb_substr($title, 0, 1);
여기에 몇 가지 세부 사항이 있습니다 : UTF-8 문자열의 첫 문자를 얻으십시오
나는 부작용이없고 오해 없이이 표기법을 사용했습니다. 문자열은 문자의 배열 일뿐입니다.
$str[42]
. 이 목적을 위해 문자열을 문자 배열로 생각하십시오. 내부적으로 PHP 문자열은 바이트 배열입니다.
$arr[] = $new_element
)은 문자열에서 작동하지 않습니다. 따라서 문자열을 문자 배열로 생각하는 것이 유용하다고 생각하지 않습니다.