2012-06-18 2 views
3

들어오는 mySQL 데이터 유형을보고 범주 수준에서 기본값을 적용 할 수 있도록 "범주"(이 코드에서 패밀리라고 함)로 롤업하는 간단한 함수가 있습니다. 어쨌든이 코드는 정수, 문자 및 텍스트 범주를 찾는 데는 문제가 없지만 datetime 및 decimal 범주에서는 완전히 실패합니다. 나는 끝내 준다.array_search unexpected unexpectedly

public static function get_family_type ($col_type) { 
    $families = array (
       'integer' => array ('integer', 'int', 'tinyint', 'mediumint', 'bigint'), 
       'fixed' => array ('decimal', 'numeric'), 
       'floating' => array ('float' , 'double'), 
       'character' => array ('char', 'varchar'), 
       'datetime' => array ('datetime' , 'timestamp'), 
       'time' => array ('time'), 
       'date' => array ('year'), 
       'text' => array ('tinytext', 'text', 'mediumtext' , 'longtext'), 
       'blob' => array ('blob','tinyblob','mediumblob','longblob') 
    ); 

    // first get rid of any optional length parameterisation 
    list ($col_type) = explode ("(" , $col_type , 2); 
    foreach ($families as $family => $family_members) { 
     if (array_search ($col_type , $family_members , true)) { 
      return $family; 
     } 
    } 
    return "unknown $col_type"; 
} 

주에게 마지막 줄에 백업 return 문을 다음 내가 코드를 다른 곳에서 정의 한 테이블에서이 출력을 보면 : 어떤 도움을 크게 감상 할 수있다.

[18-Jun-2012 17:39:24] Getting default for family of integer 
    [18-Jun-2012 17:39:24] Getting default for family of text 
    [18-Jun-2012 17:39:24] Getting default for family of character 
    [18-Jun-2012 17:39:24] Getting default for family of character 
    [18-Jun-2012 17:39:24] Getting default for family of character 
    [18-Jun-2012 17:39:24] Getting default for family of character 
    [18-Jun-2012 17:39:24] Getting default for family of character 
    [18-Jun-2012 17:39:24] Getting default for family of character 
    [18-Jun-2012 17:39:24] Getting default for family of character 
    [18-Jun-2012 17:39:24] Getting default for family of character 
    [18-Jun-2012 17:39:24] Getting default for family of character 
    [18-Jun-2012 17:39:24] Getting default for family of integer 
    [18-Jun-2012 17:39:24] Getting default for family of integer 
    [18-Jun-2012 17:39:24] Getting default for family of unknown decimal 
    [18-Jun-2012 17:39:24] Getting default for family of character 
    [18-Jun-2012 17:39:24] Getting default for family of unknown datetime 
    [18-Jun-2012 17:39:24] Getting default for family of floating 

답변

3

array_search은 성공시 배열 키를 반환하며 때로는 0의 값이됩니다. php에서 0은 부울 false로 변환됩니다. 당신은

if (array_search ($col_type , $family_members , true) !== false) { 
     return $family; 
    } 

참고 엄격한 comparsion !==

PHP 매뉴얼은 array_search에 대한 문서에서이 문제를 언급처럼 확인해야합니다.

+0

부울 자체를 반환하는 in_array()를 사용하는 것이 더 나은 이유는 무엇입니까? 자원 소모가 적습니까? – DaneSoul

+0

사실, in_array()가 더 좋은 방법입니다. 그러나, 왜 현재의 형태로 실패했는지 설명하기 위해 더 많은 것을 시도하고있었습니다. – goat

+0

고마워! 나는 이것을 읽기 전에 아침 식사에 대해 in_array에 대해 생각하고 있었고, 이것이 더 나은 기술이라는 것을 확인했습니다. 람보 덕분에 지금은 어느 기능으로도 할 수 있습니다. – ken

2

네 변화율 :

if (array_search ($col_type , $family_members , true)) { 
      return $family; 
    } 

if (in_array($col_type , $family_members , true)) { 
      return $family; 
    } 

참고

에 해당 :

array_search는 - 주어진 값의 배열을 검색하고 대응 키를 반환 성공한 경우

따라서 array_search에서 부울 값을 반환하지 않으므로 원하는대로 작동하지 않습니다.

관련 문제