2009-12-21 3 views
2

나는 주말 내내 preg_replace으로 약간 일하고 있었고 나는 이상한 것을 보았을 때 Php preg_replace documentation을 읽고 있었다.배열로 호출 된 preg_replace()에 미리 ksort()가 필요합니까? 응?

워드 프로세서에서 예 # 2 다음 PHP 코드

<?php 
$string = 'The quick brown fox jumped over the lazy dog.'; 
$patterns[0] = '/quick/'; 
$patterns[1] = '/brown/'; 
$patterns[2] = '/fox/'; 
$replacements[2] = 'bear'; 
$replacements[1] = 'black'; 
$replacements[0] = 'slow'; 
echo preg_replace($patterns, $replacements, $string); 
?> 

에게 주어 졌을 때 출력이

"The bear black slow jumped over the lazy dog." 

출력해야한다 (제 생각에) 무엇을 생성하기 위해 될 것으로 보여 기본적으로 ksort()에 미리 전화해야합니다. 같은 :

<?php 
ksort($patterns); 
ksort($replacements); 
echo preg_replace($patterns, $replacements, $string); 
?> 

이 정말 해결 방법 PHP의 preg_replace()의 버그에 대한 아닌가? 왜 PHP는 이런 식으로 행동합니까? 내가 여기 없다고 선언 한 배열에 특이한 점이 있습니까?

답변

4

워드 프로세서 또한 말한다 :

키들은

그래서이 일어나는 이유 형 foreach 단순 반복 인덱스 사용되지 않는다는 것이다 배열에 나타나는 순서대로 처리 접속하다. 그것이 내가 함수가 ksort()를 호출하지 않고 일을했을 선호하는 것이

reset($patterns); 
reset($replacements); 

$pattern = current($patterns); 
$replacement = current($replacements); 

do { 
    // Replace the pattern, if found. 
    $pattern = next($patterns); 
    $replacement = next($replacements); 
} while ($pattern !== FALSE); 

과 같은 코드를 실행 될 경우 같은

2

슬프게도 PHP의 모든 배열은 연관 배열입니다.

$replacements[2] = 'bear'; 
$replacements[1] = 'black'; 
$replacements[0] = 'slow'; 

이 2로 저장 -> 곰, 1 -> 블랙, 0 -> 느린

대신 느린

의 전형적인 블록의

| 검은 색 | 곰

+0

다른 해결책은 먼저 실행하는 배열을 생성 array_fill (0,3, NULL)이다 0-> NULL 1-> NULL, 2-> NULL, 3-> NULL 이들 요소에 대한 모든 수정 ()는이 주문을 유지합니다. 그러나 일반적으로 ksort가 아마도 최선의 선택 일 것입니다. – MindStalker

1

배열 색인은 값을 저장하는 메모리에서 next() 및 current()와 같은 함수를 지시하지 않습니다. 전달 된 배열을 사용할 때 preg_replace가 사용하는 것으로 상상해보십시오. 효율성을 위해 마지막으로 메모리 주소를 시작합니다.

PHP의 많은 것들과 마찬가지로이 배열 반복은 속도를 높이기 위해 만들어졌으며 다른 것은 개발자에게 달려 있습니다. 그래서 약간 더 많은 작업을 수행하기 위해 몇 줄을 더 추가해야합니다.