2012-06-18 2 views
3

У меня есть простая функция, которая смотрит на входящий тип данных mySQL, а затем переводит ее в категорию «категория» (называемую семейством в этом коде), чтобы я мог применять значения по умолчанию на уровне категории. Во всяком случае, этот код отлично подходит для поиска целочисленных, символьных и текстовых категорий, но полностью терпит неудачу в категориях datetime и decimal. Я нахожусь на своем пути. Любая помощь будет принята с благодарностью:array_search действует непредсказуемо

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"; 
} 

примечанию резервного копирования заявление возврата на последней строке, а затем посмотреть на этом выходе из таблицы, я определил в другом месте в коде. изменение

[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 принуждает к логическому ложному. Вы должны проверить, как

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

Примечания строгого сравнительной !==

руководство PHP упоминает об этом в документации array_search.

+0

Почему это лучше, просто используйте in_array(), которые возвращают логическое значение самого себя? Разве это не будет потреблять меньше ресурсов? – DaneSoul

+0

Фактически, in_array() - лучший способ сделать это. Но я пытался больше объяснить, почему он терпел неудачу в своей нынешней форме. – goat

+0

Спасибо, ребята! Я думал о завтрашнем дне, прежде чем я прочитал это, и, наверное, вы оба подтвердили, что это лучшая техника. Благодаря Rambo я могу сделать это с любой из функций сейчас. – ken

2

Thy:

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

в

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

Обратите внимание, что:

array_search - поиск в массиве заданного значения и возвращает соответствующую клавишу если успешно

Таким образом, это не логическое возвращение из array_search, возможно, это работает не так, как вы хотите.

Смежные вопросы