Группировка предметов

alexkoryagin

Новичок
Репутация
0 / 71
Подскажите где искать, чтоб в инвентаре ресурсы или продположим магия одинаковые предметы писалось их кол-во внизу, а не добовлялись один за одним. Спасибо заранее
 
Подскажите где искать, чтоб в инвентаре ресурсы или продположим магия одинаковые предметы писалось их кол-во внизу, а не добовлялись один за одним. Спасибо заранее

Код:
function group_objects($objects){
    $object_names = array('dust', 'spoilt_potion', 'trauma_treatment' ............); // тут дописываешь, что тебе надо группировать
    $groupped_objects = array();
    $groups = array();
    foreach($objects as $object){
        //echo $object['tip'];
        $name = get_object_name($object);
        if(in_array($name, $object_names)){
            if(!isset($groups[$name])){
                $groups[$name] = array();
            }
            $groups[$name][] = $object;
        } else {
            $object['quantity'] = 1;
            $groupped_objects[] = $object;
        }
    }
    
    foreach ($groups as $group){
        $gobject = current($group);
        $gobject['quantity'] = count($group);
        $groupped_objects[] = $gobject;
    }
    
    return $groupped_objects;
}

$objects = get_person_objects($stat); // get_person_objects напиши сам 8)
$groupped_objects = group_objects($objects);

Ну а при выводе, тогда остнется добавить что-нибудь вроде echo "Количество {$object['quantity']}".
 
Код:
function group_objects($objects){
    $object_names = array('dust', 'spoilt_potion', 'trauma_treatment' ............); // тут дописываешь, что тебе надо группировать
    $groupped_objects = array();
    $groups = array();
    foreach($objects as $object){
        //echo $object['tip'];
        $name = get_object_name($object);
        if(in_array($name, $object_names)){
            if(!isset($groups[$name])){
                $groups[$name] = array();
            }
            $groups[$name][] = $object;
        } else {
            $object['quantity'] = 1;
            $groupped_objects[] = $object;
        }
    }
    
    foreach ($groups as $group){
        $gobject = current($group);
        $gobject['quantity'] = count($group);
        $groupped_objects[] = $gobject;
    }
    
    return $groupped_objects;
}

$objects = get_person_objects($stat); // get_person_objects напиши сам 8)
$groupped_objects = group_objects($objects);

Ну а при выводе, тогда остнется добавить что-нибудь вроде echo "Количество {$object['quantity']}".

спс, а не подскажешь куда этот код внести, в какой файл? или эт в инвентаре добавляешь и все?
 
спс, а не подскажешь куда этот код внести, в какой файл?

Чтобы использовать этот код, надо понимать как он работает. Или, если не понимаешь как он работает, надо найти программиста, который поможет. Обычным копипастом тут не обойтись (я движок у себя уже почти полностью переписал).
 
а чем вас не устраивает sql: GROUP BY ?
если таблица не очень большая, то можно спокойной использовать.
никакого гимора) тока указал поля и все)
тем более sql запрос выполнится быстрее, чем равносильный код php.
 
а чем вас не устраивает sql: GROUP BY ?
если таблица не очень большая, то можно спокойной использовать.
никакого гимора) тока указал поля и все)
тем более sql запрос выполнится быстрее, чем равносильный код php.
1) не все объекты на до группировать, а только некоторые
2) имя объекта в ИВ хранится через жопу - в поле inf через | лежат имя, тайтл, цена, износ, указание на арт и что-то ещё.
потому средствами БД не обойтись вообще.
 
1) не все объекты на до группировать, а только некоторые
2) имя объекта в ИВ хранится через жопу - в поле inf через | лежат имя, тайтл, цена, износ, указание на арт и что-то ещё.
потому средствами БД не обойтись вообще.

1. соответственно добавляем нужные условия в where например where tip in (.. , .. , ..) и тд
2. Имя объекта хранится нормально, чтобы его получить достаточно написать SUBSTRING_INDEX(objects.tip, '|', 1) as nazvanije_objekta .

Прежде чем утверждать что средствами БД не обойтись рекомендую почитать мануал по mysql
 
1. соответственно добавляем нужные условия в where например where tip in (.. , .. , ..) и тд
2. Имя объекта хранится нормально, чтобы его получить достаточно написать SUBSTRING_INDEX(objects.tip, '|', 1) as nazvanije_objekta .

Прежде чем утверждать что средствами БД не обойтись рекомендую почитать мануал по mysql

Меня группировка по типу не устроила.

Мануал по mysql я читал. И работаю я с ней не первый год.

Не отрицаю, что с невозможностью, я сгустил краски, если извратиться, то запрос составить можно.

Вот расскажите мне как мне сгруппировать только apple и onion в таблице
id inf
1 apple|Яблоко
2 apple|Яблоко
3 apple|Яблоко
4 onion|Лук
5 onion|Лук
6 orange|Апельсин
7 orange|Апельсин
8 orange|Апельсин
9 orange|Апельсин

То есть в результат я хочу получить (c - количество)
с id inf
3 1 apple|Яблоко
2 4 onion|Лук
1 6 orange|Апельсин
1 7 orange|Апельсин
1 8 orange|Апельсин
1 9 orange|Апельсин
 
Меня группировка по типу не устроила.

Мануал по mysql я читал. И работаю я с ней не первый год.

Не отрицаю, что с невозможностью, я сгустил краски, если извратиться, то запрос составить можно.

Вот расскажите мне как мне сгруппировать только apple и onion в таблице
id inf
1 apple|Яблоко
2 apple|Яблоко
3 apple|Яблоко
4 onion|Лук
5 onion|Лук
6 orange|Апельсин
7 orange|Апельсин
8 orange|Апельсин
9 orange|Апельсин

То есть в результат я хочу получить (c - количество)
с id inf
3 1 apple|Яблоко
2 4 onion|Лук
1 6 orange|Апельсин
1 7 orange|Апельсин
1 8 orange|Апельсин
1 9 orange|Апельсин

элементарно, примитивным запросом
данный запрос показывает предметы типа 'apple','onion' сгрупированно, остальные - нет
Код:
SELECT count(objects.id) as kol, items.name as obj_name FROM objects, items  WHERE items.name=SUBSTRING_INDEX(objects.inf, '|', 1) AND objects.user='vasja_pupkin' AND items.name in ('apple','onion') GROUP BY items.name UNION select 1, items.name as obj_name FROM objects, items  WHERE items.name=SUBSTRING_INDEX(objects.inf, '|', 1) AND objects.user='vasja_pupkin' AND items.name not in ('apple','onion')
 
элементарно, примитивным запросом
данный запрос показывает предметы типа 'apple','onion' сгрупированно, остальные - нет
Код:
SELECT count(objects.id) as kol, items.name as obj_name FROM objects, items  WHERE items.name=SUBSTRING_INDEX(objects.inf, '|', 1) AND objects.user='vasja_pupkin' AND items.name in ('apple','onion') GROUP BY items.name UNION select 1, items.name as obj_name FROM objects, items  WHERE items.name=SUBSTRING_INDEX(objects.inf, '|', 1) AND objects.user='vasja_pupkin' AND items.name not in ('apple','onion')
Скажите, вы когда-нибудь сталкивались с высокими нагрукзками? Например 1.5КК хитов в сутки. Если сталкивались, то должны знать, что вот такой запрос скорее всего уложит вам БД. Потому его стоит избегать.

Видимо, я в шорах хайлоада перестаю видеть "формальные" решения задачи. Спсибо, что напомнили мне о существовании UNION
 
Скажите, вы когда-нибудь сталкивались с высокими нагрукзками? Например 1.5КК хитов в сутки. Если сталкивались, то должны знать, что вот такой запрос скорее всего уложит вам БД. Потому его стоит избегать.

Видимо, я в шорах хайлоада перестаю видеть "формальные" решения задачи. Спсибо, что напомнили мне о существовании UNION

ключевые слова - план запроса, индексы. запрос этот очень хорошо индексируется скорость выполнения приемлимая. Уж точно гораздо эффективней полноы выборки всех предметов с последущим объединением в PHP
 
ключевые слова - план запроса, индексы. запрос этот очень хорошо индексируется скорость выполнения приемлимая. Уж точно гораздо эффективней полноы выборки всех предметов с последущим объединением в PHP

Запрос с SUBSTRING_INDEX(objects.inf, '|', 1) и cможет идти полностью по индексу? Вот это интересно. Можно пример? Мне почему-то кажется, что там ещё и filesort будет, ну уж если добавить сортировку по цене, то точно будет.

Про эффективность можно поспорить, ибо PHP морд всегда можно добавить, а вот с масштабированием БД "традиционно" плохо.
 
Запрос с SUBSTRING_INDEX(objects.inf, '|', 1) и cможет идти полностью по индексу? Вот это интересно. Можно пример? Мне почему-то кажется, что там ещё и filesort будет
Да, насколько знаю, в MySQL покачто поддержки функциональных индексов нет, но, в качестве обходного пути, можно например создать новый столбец с индексом по нему, и обновлять его триггером.

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

В этом случае такой запрос будет гораздо быстрее выполняться, чем запрос всех предметов с последущей групировкой на PHP
Хм, интересный обход для функциональных индексов, спасибо. Надеюсь не пригодится 8)

Полностью признаю, что мое решение не лучшее (но и не худшее), а просто одно из возможных 8)
 
ребят, помогите мне конкретней, ну нихера не выходит... Ет единственное стоещее что мне нужно..
 

Похожие темы

Сверху