2011-11-29 2 views
-5

변수 $ foo를 함수에 전달합니다. 이 입력 변수는 배열 또는 문자열 일 수 있습니다. 이 배열 인 경우, 내가 설정하려면 :isset()의 카운터 직관적 인 동작

$name = $foo['name'] 

를 그리고이 문자열 인 경우, 다음 내가 설정하려면 :

$name = $foo 

는이를 위해, 나는 다음과 같은 코드를 작성 :

$name = isset($foo['name']) ? $foo['name'] : $foo 

불행히도, 이것은 작동하지 않습니다.
이유 : isset ($ foo [ 'name'])은 $ foo가 문자열 일 때 TRUE를 반환합니다.

이 동작은 나에게 놀라운 일입니다. $ foo [ 'name']가 설정되지 않았기 때문에 isset ($ foo [ 'name'])가 FALSE를 반환 할 것으로 예상했습니다. 누군가가이 겉으로보기에 반 직관적 인 행동을 설명 할 수 있습니까? 또는 $ foo [ 'name']에서 FALSE를 반환하는 isset() 대신 $ foo가 문자열 일 때를 제안합니까?

UPDATE : 아래 참조 크리스토퍼의 제안 :

$name = (is_array($foo) && isset($foo['name'])) ? $foo['name'] : $foo; 

답변

3

이것은 전혀 놀라운 것이 아닙니다.

$ foo [string]은 문자열 일 때 $ foo의 0 번째 문자를 요구하는 것과 같습니다. 'name'또는 'camel'또는 ' 시가 '또는'다른 문자열 '은 해당 맥락에서 정수 값으로 강제 변환됩니다.

array_key_exists()는 키가 인 경우에도 null 값을 가지고 있어도 을 반환하기 때문에 원하는 내용이 아닐 수도 있습니다. 또는 문자열을 불만없이 조용히 검색하므로 in_array()도 좋지 않습니다.

대신 고려 : 이것은 당신이 키 '이름'을위한 배열과 값이 null의 경우, 또는 문자열과 $ foo는이 null의 경우 할 수 계획을 어떤 고려하지 않는

$name = (is_array($foo) && isset($foo['name'])) ? $foo['name'] : $foo; 

주 , 등등. 이는 언어 부분의 단점이 아니라 응용 프로그램과 관련된 논리 부분입니다.

+0

대단히 감사합니다. 이것은 정확하게 제가 찾고 있던 설명입니다. – moondog

+0

당신은 매우 환영합니다, user606696 - 아니면 24601라고 말해야합니까! – Christopher

4

issetset이 의미하는 것은 아니다 "항목의 설정은,"그것은 느슨하게 "그것은에 할당"을 의미합니다. 따라서 질문에 말씀 하셨듯이 is_array을 대신 사용하십시오. isset없이 원하는 것을 성취 할 수 있다는 것을 깨닫는다면 을 사용해보세요.

the documentation for isset을 참조하십시오.

관련 문제