2013-09-08 2 views
1

(문제 오프셋) 제대로 작동하지 :니들은 내가이 기능을 가지고 여기

public function strposa($haystack, $needles=array(), $offset) { 
     $chr = array(); 
     foreach($needles as $needle) { 
       $res = strpos($haystack, $needle, $offset); 
       if ($res !== false) $chr[$needle] = $res; 
     } 
     if(empty($chr)) return false; 
     return min($chr); 
} 

을 그리고이 하나

function usernameCurseWords($name) { 
     $string = $name; 
     $array = array('bad', 'words', 'are', 'here'); 

     if (parent::strposa($string, $array, 0)) { 
     return true; 
     } 
    } 

나는 다음과 같이 호출 :

if ($this->usernameCurseWords($username)) { throw new Exception($error['userCurseWords']); } 

건초 더미가 "1bad"이면이 함수는 true를 반환합니다 ("bad"는 바늘입니다).

그러나 건초 더미가 "badblablbla"이면 함수는 false를 반환합니다.

이것이 올바르게 작동하지 않는 이유는 무엇입니까?

+0

나는 또한 어디서나 오프셋없이 시도했지만 여전히 동일합니다. –

+1

뭔가를 반환하는 한 반환하는 것이 중요하지 않으므로 'min ($ chr)'대신 true 또는 false를 반환합니다. 나는 당신이'parent :: strposa ($ string, $ array, 0)'에서 거짓으로 평가 될 경우 0을 반환한다고 믿는다. – asafreedman

+0

감사합니다. –

답변

1

당신이 알고있는 바늘이 건초 더미 문자열의 시작 부분에 상대적으로 존재하는 곳의 위치를 ​​반환 것이다 strpos (오프셋과 무관). 또한 문자열 위치는 1이 아닌 0에서 시작합니다.

따라서 문자열이 0 위치에서 발견되면 0을 반환합니다.

귀하의 usernameCurseWords()에있는 조건은 다음과 같습니다.

위치가 0 위치에 있으면 거짓으로 처리됩니다. 내 포인트가 있습니다.

echo strpos('badall', 'bad',0); 

은 0 위치에서 b/c 위치를 반환합니다.

echo strpos('1badall', 'bad',0); 

은 1 위치에서 1 b/c 위치를 반환합니다.

if (parent::strposa($string, $array, 0)) { 
    return true; 
    } 

하지만 반환 1. 그래서 그에 따라 코드를 변경할 경우,이 라인은 받아 들일 것입니다.

if (parent::strposa($string, $array, 0) !== false) { 
    return true; 
    } 

// 유형 일치를 시도하십시오.

+0

설명을 주셔서 감사합니다. 이제는 완전히 이해합니다. 이것이 가장 중요한 부분입니다. 코드에 관해서는 이제 min ($ chr) 대신 true를 반환하기 때문에 (이 문제로 인해 0이 발생 함) 코드는 사용하기에 더 간단합니다. –

0
!== FALSE ... and 0 is not the same, FALSE is boolean, 0 (zero) not 

그래서 그냥

!= 
+0

나는 그 변화를 만들었고 문제는 여전히 동일하다. –

0

에게이 줄을 사용하십시오 를 (빈 ($의 CHR)이) false를 반환하는 경우;

빈 (0) 사실거야, 오프셋 그래서 진정한 가 제로 =

+0

그러나 그것이 참이면, 건초 더미에 나쁜 단어/바늘이 있음을 의미합니다. 그러나이 문제에서, 바늘이 건초 더미의 맨 처음에 있었다면, 그것은 심지어 0이되는 참을 반환하지 않습니다. –