[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Двумерный массив из рекурсивного запроса к базе
serjazz
Здравствуйте уважаемые. Уже два дня ломаю голову над следующей, (как мне казалось) простой задачей:

Имеется база данных ФИАС (Федеральная информационная адресная система) установленная как mysql-база (одна таблица d_fias_addrobj), имеется установленный и настроенный на нее sphinx
sphinx.conf

source fias {
type = mysql
sql_host = localhost
sql_user = root
sql_pass = ****
sql_db = gidpoint_fias
sql_port = 3306
# пред-запрос, выполняется перед выполнением основного запроса на получение данных из базы
sql_query_pre = SET NAMES utf8
# запрос, который получает данные документов для поиска
# первым полем обязательно должен идти уникальный положительный ID документа
sql_query = \
SELECT `id`,`aoid`,`aolevel`,`shortname`,`parentguid`,`offname`,`aoguid`\
FROM d_fias_addrobj
# поля, по которым может идти группировка, фильтрация и сортировка
sql_attr_uint = id
sql_field_string = aoid
sql_field_string = parentguid
sql_field_string = shortname
sql_field_string = offname
sql_field_string = aoguid
sql_field_string = aolevel
# document info query, ONLY for CLI search (ie. testing and debugging)
# optional, default is empty
# must contain $id macro and must fetch the document by that id
sql_query_info= SELECT * FROM d_fias_addrobj WHERE id=$id }
# индекс каталога данных для поиска
index fias {
# Источник данных для индексирования
source = fias
# Адрес, где будут хранится данные индекса
path = /var/lib/sphinxsearch/data/fias
# Индекс с учетом морфологии
morphology = stem_ru
# Минимальная длина слова для индексации
min_word_len = 3
# Кодировка
charset_type = utf-8
preopen=1
}
# поисковый демон (служба)
searchd {
# какой порт и какой протокол "слушает" служба
listen = localhost:3307:mysql41
# файл с логами
log = /var/log/sphinxsearch/searchd.log
# файл с логами поисковых запросов
query_log = /var/log/sphinxsearch/query.log
# PID file, searchd process ID file name
# mandatory
pid_file = /var/run/searchd.pid
}


все пишется под yii_фремворком, но это напрямую к задаче и вопросу не относится.

Есть задача: сформировать двумерный массив из получаемых данных для последующего вывода через ajax как варианты автозаполнения для формы (ищем улицу или город).

Необходимые поля из ФИАС:
    aoid - уникальный идентификатор объекта, вида "00000e97-4287-4b0e-ac97-346ca29e5f39" (char(36))
    offname - официальное название объекта (в нашем случае может быть регион, район, город, улица)
    shortname - сокращенный тип объекта (г, обл, ул и т.п.)
    parentguid - идентификатор родительского объекта (по типу aoid)

Есть следующий пробный код:

function searcher($name='',$parentguid='',$arr = array()){
//здесь просто выбираем какой тип данных приходит к нам и от этого строим запрос
if($name != ''){
$sSql = 'SELECT *
FROM fias
WHERE
MATCH('
. Yii::app()->sphinx->quoteValue('@offname '.$name) . ') LIMIT 0,5';
} else {
if($parentguid != '' && $parentguid != null && $parentguid != 'null'){
$sSql = 'SELECT *
FROM fias
WHERE
MATCH('
. Yii::app()->sphinx->quoteValue('@aoguid '.$parentguid) . ') LIMIT 0,5';
}
}

if(isset($sSql) && $sSql != ''){
//здесь выполняем запрос (работает корректно)
$ids = Yii::app()->sphinx->createCommand($sSql)->queryAll();
foreach($ids as $id){
if(!in_array($id['shortname'].' '.$id['offname'],$arr)){
$arr[] = $id['shortname'].' '.$id['offname'];
}
if($id['parentguid'] != ''){
$arr[] = searcher('',$id['parentguid'],$arr);
}
}
}

return $arr;
}


Вызывается как:
$finarr = searcher('Новоалтайск','','');


Он формирует примерно следующее содержимое (var_dump):

array (size=7)
0 => string 'ул Новоалтайская' (length=31)
1 =>
array (size=3)
0 => string 'ул Новоалтайская' (length=31)
1 => string 'г Новосибирск' (length=25)
2 =>
array (size=3)
0 => string 'ул Новоалтайская' (length=31)
1 => string 'г Новосибирск' (length=25)
2 => string 'обл Новосибирская' (length=33)
2 =>
array (size=4)
0 => string 'ул Новоалтайская' (length=31)
1 =>
array (size=3)
0 => string 'ул Новоалтайская' (length=31)
1 => string 'г Новосибирск' (length=25)
2 =>
array (size=3)
0 => string 'ул Новоалтайская' (length=31)
1 => string 'г Новосибирск' (length=25)
2 => string 'обл Новосибирская' (length=33)
2 => string 'г Белокуриха' (length=23)
3 =>
array (size=4)
0 => string 'ул Новоалтайская' (length=31)
1 =>
array (size=3)
0 => string 'ул Новоалтайская' (length=31)
1 => string 'г Новосибирск' (length=25)
2 =>
array (size=3)
0 => string 'ул Новоалтайская' (length=31)
1 => string 'г Новосибирск' (length=25)
2 => string 'обл Новосибирская' (length=33)
2 => string 'г Белокуриха' (length=23)
3 => string 'край Алтайский' (length=27)
//..................................... и т.д.


Собственно вопрос: Что я делаю не так в присвоении массиву данных? Данный вывод с точки зрения механизма функции логичен, но что нужно перестроить в ней? Мне нужно получить массив примерно следующего вида (т.е. двумерный массив с данными):

array (size=3)
0 => array(size=3)
0 => string 'ул Новоалтайская' (length=31)
1 => string 'г Новосибирск' (length=25)
2 => string 'обл Новосибирская' (length=33)
1 => array (size=3)
0 => string 'ул Новоалтайская' (length=31)
1 => string 'г Белокуриха' (length=23)
2 => string 'край Алтайский' (length=27)
2=> array (size=3)
//................... и т.д.


P.S. Возможно вопрос из серии тупых, но уже голову сломал за два дня, если у кого есть какие версии куда смотреть, буду очень рад и благодарен.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.