ТаблицейБлоками.

Как в PHP поместить enum в массив?

Последняя модификация: 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>';
?>

 

Комментарии к странице (всего 1)

 

 

 


На главную страницу сайта