Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обработка данных после выборки. 
:(
    Опции темы
Serious2008
Дата 5.2.2012, 14:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 28.1.2011

Репутация: нет
Всего: нет



Мне посоветовали решить одну проблему вот таким вот образом.

2. Пробегаемся в цикле по полученному результату, сформировав массив вида $arList[$arResult[$i]['ID']] = $arResult[$i]; т.е. в качестве ключей будут выступать ID, а значение это все остальные поля раздела
3. Запускаем еще один цикл по $arList, примерно такого содержания
foreach($arList as $sKey => $sName)
{
    $arList[$sKey]['FULL_PATH'] = funRecursive($sKey);
}
В этом цикле мы для каждого раздела присваиваем ключ FULL_PATH, где будет хранится примерно такой путь "Обрезная доска >> Доски (доска) >> Куплю."
 Функция funRecursive, которая рекурсивно ищет родителей и возвращает эту самую строку "Обрезная доска >> Доски (доска) >> Куплю."
Вот до чего я дошёл, а вот что делать с функцией  funRecursive($sKey); я не знаю.
Код

while ($arResult = myqsl_fetch_assov($query)
  { 
      $i++;
      $arList[$arResult[$i]['ID']] = $arResult[$i];
  }
foreach($arList as $sKey => $sName)
{
    $arList[$sKey]['FULL_PATH'] = funRecursive($sKey);
}


Это сообщение отредактировал(а) Serious2008 - 5.2.2012, 14:39
PM MAIL   Вверх
$дмитрий
Дата 5.2.2012, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 19.6.2004

Репутация: 3
Всего: 45



Пример работы функции funRecursive
Код

<?
$arList[1] = array('ID' => 1, 'PARENT' => 0, 'NAME' => 'Раздел 1');
$arList[2] = array('ID' => 2, 'PARENT' => 0, 'NAME' => 'Раздел 2');

$arList[3] = array('ID' => 3, 'PARENT' => 2, 'NAME' => 'Раздел 3 вложеный в раздел 2');
$arList[4] = array('ID' => 4, 'PARENT' => 3, 'NAME' => 'Раздел 4 вложеный в раздел 3');

$arList[5] = array('ID' => 5, 'PARENT' => 0, 'NAME' => 'Раздел 5');

foreach($arList as $sKey => $sName)
{
    $arList[$sKey]['FULL_PATH'] = implode(' -> ', funRecursive($sKey, $arList));
}

function funRecursive($nID, $arList, $arItem = array())
{
    if(isset($arList[$nID])){
        $arItem[] = $arList[$nID]['NAME'];
        $arItem = funRecursive($arList[$nID]['PARENT'], $arList, $arItem);
    }else{
        $arItem = array_reverse($arItem);
    }
    return $arItem;
}

?><pre><?
print_r($arList);
?>

PM MAIL   Вверх
Serious2008
Дата 5.2.2012, 15:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 28.1.2011

Репутация: нет
Всего: нет



$дмитрий, 
После подстановки твоего. Вот что получилось.
Код

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 35 bytes) in /u~~~~~cat.php on line 60

Причём это именно на твоём обработчике.

Примерное содержимое массива до обработки, Их 55 эллементов там всего.
Код

Array
(
    [0] =&gt; Array
        (
            [ID] =&gt; 1411
            [PARENT] =&gt; 0
            [NAME] =&gt; Обрезная доска
        )

    [1] =&gt; Array
        (
            [ID] =&gt; 1412
            [PARENT] =&gt; 1411
            [NAME] =&gt; Доски (доска)
        )

    [2] =&gt; Array
        (
            [ID] =&gt; 436
            [PARENT] =&gt; 1412
            [NAME] =&gt; Продам
        )

    [3] =&gt; Array
        (
            [ID] =&gt; 437
            [PARENT] =&gt; 1412
            [NAME] =&gt; Куплю
        )

    [4] =&gt; Array
        (
            [ID] =&gt; 1413
            [PARENT] =&gt; 1411
            [NAME] =&gt; Доска обрезная
        )

   
)


А это всё нужно делаться под учёт того что категорий 500-1000 может быть.

Это сообщение отредактировал(а) Serious2008 - 5.2.2012, 15:38
PM MAIL   Вверх
$дмитрий
Дата 5.2.2012, 15:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 19.6.2004

Репутация: 3
Всего: 45



Не правильный массив, ключ должен быть равен ID раздела

Код

Array
(
    [1411] =&gt; Array
        (
            [ID] =&gt; 1411
            [PARENT] =&gt; 0
            [NAME] =&gt; Обрезная доска
        )
    [1412] =&gt; Array
        (
            [ID] =&gt; 1412
            [PARENT] =&gt; 1411
            [NAME] =&gt; Доски (доска)
        )
    ...


PM MAIL   Вверх
Serious2008
Дата 5.2.2012, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 28.1.2011

Репутация: нет
Всего: нет



$дмитрий, 
А можно ли как-нибудь модифицировать. Чтобы отображались только конечные дети, без родителей. 
Т.е. например выбрал он вот такое.
Код

Обрезная доска
Обрезная доска > Доски (доска)
Обрезная доска > Доски (доска) > Продам
Обрезная доска > Доски (доска) > Куплю
Обрезная доска > Доска обрезная
Обрезная доска > Доска обрезная > Продам

а оставалось только
Код

Обрезная доска > Доски (доска) > Продам
Обрезная доска > Доски (доска) > Куплю
Обрезная доска > Доска обрезная > Продам

Всё элегантно решил. Через сбор вначале всех ID родителей. А потом проверку того, есть в этом массиве элемент или нет.

Это сообщение отредактировал(а) Serious2008 - 5.2.2012, 18:10
PM MAIL   Вверх
Serious2008
Дата 6.2.2012, 12:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 294
Регистрация: 28.1.2011

Репутация: нет
Всего: нет




Появилась ещё одна проблема. На этой выборке.

Поскольку я выбираю все записи содержащие определённое слово. И они являются детьми кого-то. Не всегда у родителей есть тоже слово что и у детей.
Поэтому нужно как-то родителей добираться.
Я модифицировал рекурсию вот таким образом
Код

function funRecursive($nID, $arList, $arItem = array())
{
    if($arList[$nID]['PARENT'] == 0 or isset($arList[$nID]))
    {
        $num_rowss = 0;
    }
    else
    {
    $querys = "SELECT id, name, pid FROM table WHERE id = ".$arList[$nID]['PARENT'];
    $results=mysql_query($querys);
    $num_rowss = mysql_num_rows($results);
    }
    if(isset($arList[$nID])){
        $arItem[] = $arList[$nID]['NAME'];
        $arItem = funRecursive($arList[$nID]['PARENT'], $arList, $arItem);
    }elseif($num_rowss > 0)
     {
    $arResult=mysql_fetch_assoc($result);
    $arList[$arResult['id']] = array('ID' => $arResult['id'], 'PARENT' => $arResult['pid'], 'NAME' => $arResult['name']);
    $arItem[] = $arList[$nID]['NAME'];
        $arItem = funRecursive($arList[$nID]['PARENT'], $arList, $arItem);
    }else{
        $arItem = array_reverse($arItem);
    }
    return $arItem;
}


Но мне это не помогло выводиться точно тоже самое. Что и было. Просто дети без родителей, если у родителей нет нужных ключевых слов.
PM MAIL   Вверх
$дмитрий
Дата 6.2.2012, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1037
Регистрация: 19.6.2004

Репутация: 3
Всего: 45



funRecursive не трогай, она предназначена только для получения полного пути

1. Сделай дополнительный запрос с LIKE содержащию нужную подстроку. Сформируй массив $arShowSection, где в качестве ключей будет ID раздела

Получиться примерно так
Код

$arShowSection[1000] = true;
$arShowSection[1001] = true;
$arShowSection[1002] = true;
$arShowSection[1003] = true;


2. В цикле $arList проверяешь есть ли $arShowSection[КЛЮЧ_ТЕКУЩЕГО_РАЗДЕЛА]

Примерный код
Код

<?
$arList[1] = array('ID' => 1, 'PARENT' => 0, 'NAME' => 'Раздел 1');
$arList[2] = array('ID' => 2, 'PARENT' => 0, 'NAME' => 'Раздел 2');
$arList[3] = array('ID' => 3, 'PARENT' => 2, 'NAME' => 'Раздел 3 вложеный в раздел 2');
$arList[4] = array('ID' => 4, 'PARENT' => 3, 'NAME' => 'Раздел 4 вложеный в раздел 3');
$arList[5] = array('ID' => 5, 'PARENT' => 0, 'NAME' => 'Раздел 5');

// ЗДЕСЬ ФОРМИРУЕМ МАССИВ $arShowSection

foreach($arList as $sKey => $sName)
{
    if(isset($arShowSection[$sKey])){
     $arList[$sKey]['DISABLE'] = true;
     continue;
    }
    $arList[$sKey]['FULL_PATH'] = implode(' -> ', funRecursive($sKey, $arList));
}
function funRecursive($nID, $arList, $arItem = array())
{
    if(isset($arList[$nID])){
        $arItem[] = $arList[$nID]['NAME'];
        $arItem = funRecursive($arList[$nID]['PARENT'], $arList, $arItem);
    }else{
        $arItem = array_reverse($arItem);
    }
    return $arItem;
}
?><pre><?
print_r($arList);
?>

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.0501 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.