array_search($value, $array)는 $value와 같은 첫 번째 요소의 키를 반환하고, 일치하는 요소가 없으면 false를 반환합니다. 찾은 키가 0일 수 있으므로 if (($key = array_search('pear', $fruits)) !== false)처럼 결과를 !== false로 확인하세요.
있다 없다만 알면 된다면 in_array()가 그것을 바로 알려 줍니다. array_search()는 값이 어디에 있는지 알아야 할 때, 예를 들어 그 값을 바꾸거나 지울 때 씁니다.
0과 false 함정
array_search()의 가장 흔한 버그입니다. 값이 첫 번째 요소라 키가 0이고, if ($key)가 0을 거짓으로 취급합니다. 바로 거기 있는 값인데 코드는 "찾지 못함"이라고 말합니다. 진짜 false에만 일치하는 !== false로 비교하세요.
0 == false가 true이므로 != false도 if ($key)와 같은 버그가 있습니다. 엄격한 연산자만 둘을 구분합니다.
엄격한 검색
in_array()처럼 array_search()도 세 번째 인수로 true를 넘기지 않으면 ==로 비교합니다. 느슨한 모드에서는 문자열이 숫자를 찾고 null이 0을 찾아서 예상하지 못한 키가 반환됩니다.
값이 같은 모든 키 찾기
array_search()는 첫 번째 일치에서 멈춥니다. array_keys($array, $value)는 일치하는 모든 키를 배열로 반환하며, 엄격한 비교를 하려면 true를 추가하세요. 빈 결과는 일치가 없다는 뜻이므로 0과 false를 헷갈릴 일이 없습니다.
array_column으로 다차원 배열 검색하기
array_search()는 중첩 배열 안을 보지 않습니다. 행 목록이라면 검색할 필드를 array_column()으로 뽑으세요. 그 목록의 위치가 행 번호와 일치하므로 결과가 행의 인덱스가 됩니다.
array_column()은 결과에 0부터 번호를 다시 매기므로, 행 번호가 빈틈없이 0, 1, 2일 때만 맞아떨어집니다. unset()이나 array_filter() 후에는 번호에 빈틈이 생기므로, 먼저 행에 array_values()를 적용하거나 마지막 두 줄의 키 기반 조회를 쓰세요. 인덱스 키 형태는 array_column()에서 더 다룹니다.
대소문자를 무시하는 검색
array_search()는 문자열을 정확히 비교합니다. 대소문자를 무시하려면 양쪽을 소문자로 바꾸세요. array_map()은 키를 유지하므로 돌려받는 키는 원래 배열의 키입니다.
검색한 뒤 바꾸거나 지우기
검색하는 흔한 이유는 찾은 요소에 무언가를 하기 위해서입니다. 키를 얻으면 대입해서 바꾸거나 unset()으로 지우되, 항상 먼저 !== false로 확인하세요. unset($arr[false])는 키가 0인 요소를 조용히 지웁니다.
자주 묻는 질문
array_search는 값을 찾지 못하면 무엇을 반환하나요?
false입니다. 값을 찾으면 키를 반환하는데, 그 키가 0이나 빈 문자열일 수 있으므로 결과는 if ($key)나 != false가 아니라 !== false로 확인하세요.
array_search 확인이 첫 번째 요소에서 실패하는 이유는 무엇인가요?
인덱스 배열의 첫 번째 요소는 키가 0이고, 0은 거짓으로 취급됩니다. 그래서 if (array_search('a', ['a', 'b']))는 찾지 못한 쪽 분기로 갑니다. if (array_search('a', $arr) !== false)로 쓰세요.
PHP에서 한 값에 대한 모든 키를 찾으려면 어떻게 하나요?
array_search()는 첫 번째 일치에서 멈춥니다. array_keys($array, $value, true)는 값이 일치하는 모든 키를 배열로 반환합니다(없으면 빈 배열).
PHP에서 다차원 배열을 검색하려면 어떻게 하나요?
필드를 평평한 목록으로 뽑아 그것을 검색하세요: $i = array_search('ada@example.com', array_column($users, 'email')); 그다음 행을 $users[$i]로 읽습니다. 행 번호가 0, 1, 2일 때 동작하며, 그렇지 않다면 foreach로 반복하세요.