array_search行为不可预测

时间:2012-06-18 17:48:50

标签: php

我有一个简单的函数,它查看传入的mySQL数据类型,然后将其汇总到“类别”(在此代码中称为系列),以便我可以在类别级别应用默认值。无论如何,此代码适用于查找整数,字符和文本类别,但在datetime和decimal类别上完全失败。我的智慧结束了。任何帮助将不胜感激:

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

2 个答案:

答案 0 :(得分:3)

array_search成功返回数组键,有时值为0.在php中,0强制为布尔值false。你需要检查

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

请注意严格的比较!==

php手册在array_search的文档中提到了这一点。

答案 1 :(得分: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的布尔返回,这可能是为什么它不能按你的意愿工作。

相关问题