Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Формирование массива из БД (MS SQL)

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
contrafact
Отправлено: 10 Июля, 2015 - 16:06:09
Post Id


Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Июль 2015  


Помог: 0 раз(а)




Здравствуйте.

Есть следующая задача. На входе запрос к БД (MS SQL), выбирающий нужные данные. Необходимо сформировать массив (или массив массивов, здесь я плаваю) и передать его в другую функцию в качестве переменной для построения иерархического списка. Сама функция построения дерева есть, написана не мной, поэтому вопрос не о ней.

CODE (SQL):
скопировать код в буфер обмена
  1. SELECT GP_ID, GP_NAME, TASK_ID, TASK_PP_PARENT, TASK_NAME, MAIN_ACTION_ID, ID_TASK_PARENT, MAIN_ACTION_NAME FROM TABLE ORDER BY GP_ID


Иерархия формируется из GP_ID, TASK_ID, MAIN_ACTION_ID в указанном порядке. Остальные поля - названия и ключи, указывающие на родителя.

От меня требуется создать массив следующего вида:
PHP:
скопировать код в буфер обмена
  1. $glhl_array = array(
  2.     'GP_NAME1' => array (
  3.         'TASK_NAME1' => array (
  4.             'MAIN_ACTION_NAME' => null,
  5.             'MAIN_ACTION_NAME' =>  null,
  6.             'MAIN_ACTION_NAME'  =>  null,
  7.         ),
  8.         'TASK_NAME2' => array (
  9.             'MAIN_ACTION_NAME' => null,
  10.             'MAIN_ACTION_NAME' =>  null,
  11.             'MAIN_ACTION_NAME'  =>  null,
  12.         ),
  13.     'GP_NAME2' => array (
  14.         'TASK_NAME3' => array (
  15.             'MAIN_ACTION_NAME' => null,
  16.             'MAIN_ACTION_NAME' =>  null,
  17.             'MAIN_ACTION_NAME'  =>  null,
  18.         ),
  19.         'TASK_NAME4' => array (
  20.             'MAIN_ACTION_NAME' => null,
  21.             'MAIN_ACTION_NAME' =>  null,
  22.             'MAIN_ACTION_NAME'  =>  null,
  23.         ),
  24. );


Количество элементов (родителей и деток) в готовом списке не больше тысячи, если это важно.
По причине того, что сам список строится другой функцией, верстку я не привожу. Но если она все-таки нужна, скажите.

Да, вы будете правы, если скажете, что в интернете полно примеров построения таких массивов с помощью рекурсивной функции, но я и браться не знаю с какой стороны.
Возможно, я указал не всю нужную для ответа информацию, если что дайте знать.

Большое спасибо тем, кто отзовется.
 
 Top
ХозяЕн
Отправлено: 10 Июля, 2015 - 16:12:40
Post Id



Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Июль 2015  


Помог: 0 раз(а)




Так как на картинке сделано пойдет?
Upd:
Может я не совсем понял что требуется от тебя)
Прикреплено изображение (Нажмите для увеличения)
dfpgf.jpg

(Отредактировано автором: 10 Июля, 2015 - 16:13:34)

 
 Top
contrafact
Отправлено: 10 Июля, 2015 - 16:19:40
Post Id


Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Июль 2015  


Помог: 0 раз(а)




ХозяЕн пишет:
Так как на картинке сделано пойдет?
Upd:
Может я не совсем понял что требуется от тебя)

Я должен сделать функцию, которая соберет массив, который нужно передать в переменную для функции, строящую сам список.
т.е. вместо этой "заглушки".
PHP:
скопировать код в буфер обмена
  1. $glhl_array = array(
  2.     'GP_NAME1' => array (
  3.         'TASK_NAME1' => array (
  4.             'MAIN_ACTION_NAME' => null,
  5.             'MAIN_ACTION_NAME' =>  null,
  6.             'MAIN_ACTION_NAME'  =>  null,
  7.         ),
  8.         'TASK_NAME2' => array (
  9.             'MAIN_ACTION_NAME' => null,
  10.             'MAIN_ACTION_NAME' =>  null,
  11.             'MAIN_ACTION_NAME'  =>  null,
  12.         ),
  13.     'GP_NAME2' => array (
  14.         'TASK_NAME3' => array (
  15.             'MAIN_ACTION_NAME' => null,
  16.             'MAIN_ACTION_NAME' =>  null,
  17.             'MAIN_ACTION_NAME'  =>  null,
  18.         ),
  19.         'TASK_NAME4' => array (
  20.             'MAIN_ACTION_NAME' => null,
  21.             'MAIN_ACTION_NAME' =>  null,
  22.             'MAIN_ACTION_NAME'  =>  null,
  23.         ),
  24. );
 
 Top
and_07
Отправлено: 10 Июля, 2015 - 17:27:41
Post Id


Гость


Покинул форум
Сообщений всего: 91
Дата рег-ции: Сент. 2012  


Помог: 3 раз(а)




ну думаю рекурсия вам поможет

либо рекурсивный запрос в базе что то типа

 
 Top
Мелкий Супермодератор
Отправлено: 10 Июля, 2015 - 17:31:46
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Если я правильно понял, что надо получить, то нафиг тут рекурсия?

PHP:
скопировать код в буфер обмена
  1. $glhl_array = [];
  2. foreach ($db_result as $row) {
  3. $glhl_array[ $row['GP_ID'] ][ $row['TASK_ID'] ][ $row['MAIN_ACTION_NAME'] ] = null;
  4. }


-----
PostgreSQL DBA
 
 Top
and_07
Отправлено: 10 Июля, 2015 - 17:45:27
Post Id


Гость


Покинул форум
Сообщений всего: 91
Дата рег-ции: Сент. 2012  


Помог: 3 раз(а)




PHP:
скопировать код в буфер обмена
  1.  
  2. [GP_NAME][TASK_NAME][MAIN_ACTION_NAME]
  3.  

(Отредактировано автором: 10 Июля, 2015 - 17:49:30)

 
 Top
contrafact
Отправлено: 13 Июля, 2015 - 09:40:15
Post Id


Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Июль 2015  


Помог: 0 раз(а)




Мелкий пишет:
Если я правильно понял, что надо получить, то нафиг тут рекурсия?

PHP:
скопировать код в буфер обмена
  1. $glhl_array = [];
  2. foreach ($db_result as $row) {
  3. $glhl_array[ $row['GP_ID'] ][ $row['TASK_ID'] ][ $row['MAIN_ACTION_NAME'] ] = null;
  4. }

Нужен массив из имен GP_NAME, TASK_NAME, MAIN_ACTION_NAME (ключи - GP_ID, TASK_ID, MAIN_ACTION_ID; TASK_PP_PARENT указывает на родителя GP_ID для TASK_ID; ID_TASK_PARENT указывает на родителя TASK_ID для MAIN_ACTION_ID), в том виде, как приведено в первом посте.
Запрос к БД возвращает таблицу с ID, именами и ID родителя. Прикрепил файл.
Честно говоря, вообще не понял, что Вы написали. Это работать никак не будет.
Может-то и можно без рекурсии, я не программист, чтобы судить.
Прикреплено изображение (Нажмите для увеличения)
sql.png
 
 Top
and_07
Отправлено: 13 Июля, 2015 - 10:02:54
Post Id


Гость


Покинул форум
Сообщений всего: 91
Дата рег-ции: Сент. 2012  


Помог: 3 раз(а)




А вы пробовали смотреть

что получается на выходе из $glhl_array
 
 Top
contrafact
Отправлено: 13 Июля, 2015 - 10:25:44
Post Id


Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Июль 2015  


Помог: 0 раз(а)




and_07 пишет:
А вы пробовали смотреть

что получается на выходе из $glhl_array

Конечно, я сразу Ваш пример попробовал.
CODE (php):
скопировать код в буфер обмена
  1.  
  2. function _getArray($idGP, $conn)
  3. {
  4.         $strSQL = "select GP_ID, GP_CODE, GP_ID_PARENT, GP_ID_TYPE, GP_NAME, TASK_ID, TASK_PP_PARENT, TASK_CODE, TASK_NAME,MAIN_ACTION_ID,MAIN_ACTION_CODE,MAIN_ACTION_NAME from  [dbo].[_v2_DWH_SP_GP_PP_INFO](".$idGP.",1,'mainActions') order by GP_ID";
  5.         $sql_query = sqlsrv_query($conn, $strSQL);
  6.        
  7.         $glhl_array = [];
  8.         foreach ($sql_query as $row)
  9.         {
  10.                 $glhl_array[$row['GP_ID'] ][$row['TASK_ID'] ][$row['MAIN_ACTION_NAME']] = null;
  11.         }
  12.         print_r($glhl_array);
  13.        
  14. }
  15.  

Не строится.

(Отредактировано автором: 13 Июля, 2015 - 10:26:37)

 
 Top
and_07
Отправлено: 13 Июля, 2015 - 11:07:38
Post Id


Гость


Покинул форум
Сообщений всего: 91
Дата рег-ции: Сент. 2012  


Помог: 3 раз(а)




а что возвращает??

+ вы читали что делает функция sqlsrv_query и что она возвращает??
 
 Top
contrafact
Отправлено: 13 Июля, 2015 - 11:22:02
Post Id


Новичок


Покинул форум
Сообщений всего: 5
Дата рег-ции: Июль 2015  


Помог: 0 раз(а)




and_07 пишет:
а что возвращает??

+ вы читали что делает функция sqlsrv_query и что она возвращает??


Видимо стоило использовать sqlsrv_fetch_array. Ничего не возвращает.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB