|
Последняя модификация: 10.08.2014 г Страница загружена с адреса: http://webdesign.site3k.ru/sovet/enum_to_php_array.html Как в PHP поместить enum в массивВ очередной раз, работая с SQL-типом данных enum, решил посмотреть, как другие люди в PHP преобразуют тип enum в массив. Задал запрос в поиск гугла «php enum в массив» и начал просматривать результаты. После десятого стало грустно, и я решил написать об этом небольшую статью ну нет в сети нормального алгоритма преобразования enum в массив средствами PHP! Во-первых, что за запрос: $sql = "show columns from $table like '$column'"; ну это же нет слов, одни местоимения. Еще бы REGEXP применили, чтоб сервер загрузить по полной программе. Но это далеко не все извращения, проделываемые ради превращения enum в массив PHP. Однако, не буду их перечислять, так как число бредовых решений множество, в то время, как правильных всего три. Во-первых, для получения всех значений поля типа enum с именем «enum_field» из базы, имя которой хранится в константе basename, нужно выполнить запрос типа: $sql="DESCRIBE ".basename." `enum_field`";// создать запрос для enum-поля enum_field $result=mysql_query($sql) or die(mysql_error());// получить ответ $records=mysql_num_rows($result);// получить количество записей if($records){// если записи есть @$enum_ar=mysql_fetch_assoc($result);// получить запись в массив /* тут будет код для превращения enum в массив */ } mysql_free_result($result);// освободить память от результатов SQL-запроса. Во-вторых, можно применить один из трех методов преобразования enum в PHP-массив. Метод первый: preg_match_all("/'(.*?)'/i", $enum_ar['Type'], $ar); В итоге, в элементе массива $ar с индексом 1, содержится массив всех значений enum-поля. Указанную выше строку нужно вставлять вместо «тут будет код ». Результат можно проверить, поместив в самом конце кода три строки: echo '<pre>'; print_r($ar[1]); echo '</pre>'; Метод второй: Чтобы не менять проверочный код, а возможно и другие места программы, где использовался $ar[1] из первого метода, используем в нем тот же первый индекс массива $ar. $ar[1]=explode(',',preg_replace('/^enum\((.*)\)$/i','${1}',str_replace("'",'',$enum_ar['Type']))); Этот вариант более громоздкий по коду, но позволяет, при желании, обходиться без лишних индексов (использовать не $ar[1], а $ar). Метод третий: Так же позволяет использовать не $ar[1], а $ar, но использует жудкий eval, которого начинающие программисты боятся, как черт ладана. eval('$ar[1]='.str_replace('enum','array',$enum_ar['Type']).';'); Таким образом, полный PHP код для получения enum в массив может выглядеть так: <?php $sql="DESCRIBE ".basename." `enum_field`"; $result=mysql_query($sql) or die(mysql_error()); $records=mysql_num_rows($result); if($records){ @$enum_ar=mysql_fetch_assoc($result);// получить запись в массив eval('$ar='.str_replace('enum','array',$enum_ar['Type']).';'); } mysql_free_result($result); // только для того, чтобы убедиться, что значения enum действительно попали в массив echo '<pre>'; print_r($ar); echo '</pre>'; ?>
|