Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.03.2014, 15:38   #1
woojin
Пользователь
 
Регистрация: 20.10.2013
Сообщений: 32
Вопрос уменьшение массива-массивов

всем привет!!!

есть массив
PHP код:
Array
(
    [
1] => Array
        (
            [
i0] => Array
                (
                    [
id] => s_79
                    
[db] => 4
                
)

            [
t1] => Array
                (
                    [
id] => s_86
                    
[db] => 1
                
)

            [
t2] => Array
                (
                    [
id] => s_88
                    
[db] => 1
                
)

        )

    [
4] => Array
        (
            [
i3] => Array
                (
                    [
id] => s_79
                    
[db] => 3
                
)

            [
t4] => Array
                (
                    [
id] => s_94
                    
[db] => 1
                
)

        )

    [
6] => Array
        (
            [
i5] => Array
                (
                    [
id] => s_79
                    
[db] => 2
                
)

            [
t6] => Array
                (
                    [
id] => s_86
                    
[db] => 1
                
)

            [
t7] => Array
                (
                    [
id] => s_88
                    
[db] => 1
                
)

        )


надо уменьшить количество элементов прибавив единицы (db) к уже имеющимся
т.е. должно получится вот так
PHP код:
Array
(
    [
1] => Array
        (
            [
i0] => Array
                (
                    [
id] => s_79
                    
[db] => 9
                
)

            [
t1] => Array
                (
                    [
id] => s_86
                    
[db] => 2
                
)

            [
t2] => Array
                (
                    [
id] => s_88
                    
[db] => 2
                
)

            [
t4] => Array
                (
                    [
id] => s_94
                    
[db] => 1
                
)
        )

уже весь мозг сломал
woojin вне форума Ответить с цитированием
Старый 24.03.2014, 17:26   #2
ATL
Форумчанин
 
Аватар для ATL
 
Регистрация: 26.01.2007
Сообщений: 278
По умолчанию

Т.е. список ключей всегда:
i0
t1
t2
i3
t4
i5
t6
t7

а на выходе всегда:
i0
t1
t2
t4

Или как?
ATL вне форума Ответить с цитированием
Старый 24.03.2014, 17:28   #3
fiveze
Новичок
Джуниор
 
Регистрация: 24.03.2014
Сообщений: 2
По умолчанию

PHP код:

$array 
= array(); // Исходный массив

$merge_array = array(); // Новый массив

foreach($array as $value){

$merge_array array_merge($merge_array$value);

}

print_r($merge_array); // Профит! 
fiveze вне форума Ответить с цитированием
Старый 24.03.2014, 17:31   #4
fiveze
Новичок
Джуниор
 
Регистрация: 24.03.2014
Сообщений: 2
По умолчанию

Поспешил, увы. Немного подробностей бы не помешало, да.
fiveze вне форума Ответить с цитированием
Старый 24.03.2014, 18:40   #5
woojin
Пользователь
 
Регистрация: 20.10.2013
Сообщений: 32
По умолчанию

Цитата:
Сообщение от ATL Посмотреть сообщение
Т.е. список ключей всегда:
i0
t1
t2
i3
t4
i5
t6
t7

а на выходе всегда:
i0
t1
t2
t4

Или как?
у первого элемента всегда буква "i"
а нумерация сквозная от "0" до "n"

тут всё зависит не от ключей, а от содержимого,
всегда первый элемент должен оставаться первым
другой пример:
PHP код:
Array
(
    [
4] => Array
        (
            [
i0] => Array
                (
                    [
id] => s_101
                    
[db] => 1
                
)
        )
    [
2] => Array
        (
            [
i1] => Array
                (
                    [
id] => s_699
                    
[db] => 1
                
)
        )
    [
7] => Array
        (
            [
i2] => Array
                (
                    [
id] => s_101
                    
[db] => 1
                
)
        )
    [
17] => Array
        (
            [
i3] => Array
                (
                    [
id] => s_333
                    
[db] => 2
                
)
        )
    [
3] => Array
        (
            [
i4] => Array
                (
                    [
id] => s_53
                    
[db] => 1
                
)
            [
t5] => Array
                (
                    [
id] => s_333
                    
[db] => 1
                
)
            [
t6] => Array
                (
                    [
id] => s_584
                    
[db] => 1
                
)
        )
    [
8] => Array
        (
            [
i7] => Array
                (
                    [
id] => s_216
                    
[db] => 2
                
)
            [
t8] => Array
                (
                    [
id] => s_88
                    
[db] => 1
                
)
            [
t9] => Array
                (
                    [
id] => s_85
                    
[db] => 1
                
)
            [
t10] => Array
                (
                    [
id] => s_84
                    
[db] => 1
                
)
        )
    [
12] => Array
        (
            [
i11] => Array
                (
                    [
id] => s_53
                    
[db] => 1
                
)
            [
t12] => Array
                (
                    [
id] => s_584
                    
[db] => 1
                
)
        )
    [
14] => Array
        (
            [
i13] => Array
                (
                    [
id] => s_216
                    
[db] => 2
                
)
            [
t14] => Array
                (
                    [
id] => s_86
                    
[db] => 1
                
)
            [
t15] => Array
                (
                    [
id] => s_84
                    
[db] => 1
                
)
        )

из такого получится вот это
PHP код:
Array
(
    [
4] => Array
        (
            [
i0] => Array
                (
                    [
id] => s_101
                    
[db] => 2
                
)
        )
    [
2] => Array
        (
            [
i1] => Array
                (
                    [
id] => s_699
                    
[db] => 1
                
)
        )
    [
17] => Array
        (
            [
i3] => Array
                (
                    [
id] => s_333
                    
[db] => 2
                
)
        )
    [
3] => Array
        (
            [
i4] => Array
                (
                    [
id] => s_53
                    
[db] => 2
                
)
            [
t5] => Array
                (
                    [
id] => s_333
                    
[db] => 1
                
)
            [
t6] => Array
                (
                    [
id] => s_584
                    
[db] => 2
                
)
        )
    [
8] => Array
        (
            [
i7] => Array
                (
                    [
id] => s_216
                    
[db] => 4
                
)
            [
t8] => Array
                (
                    [
id] => s_88
                    
[db] => 1
                
)
            [
t9] => Array
                (
                    [
id] => s_85
                    
[db] => 1
                
)
            [
t10] => Array
                (
                    [
id] => s_84
                    
[db] => 2
                
)
            [
t14] => Array
                (
                    [
id] => s_86
                    
[db] => 1
                
)
        )

woojin вне форума Ответить с цитированием
Старый 24.03.2014, 18:43   #6
woojin
Пользователь
 
Регистрация: 20.10.2013
Сообщений: 32
По умолчанию

Цитата:
Сообщение от fiveze Посмотреть сообщение
Поспешил, увы. Немного подробностей бы не помешало, да.
при выполнении MERGE если индекс нового элемента совпадает с индексом старого, то ничего не происходит
они ни складываются не отнимаются, не затираются, просто новый элемент ингнорится
woojin вне форума Ответить с цитированием
Старый 26.03.2014, 01:27   #7
woojin
Пользователь
 
Регистрация: 20.10.2013
Сообщений: 32
Восклицание

в общем это работает
PHP код:
    function firstElemKey($arr$ElemKey TRUE) {
        if (
$ElemKey) {
            return 
array_shift(array_values($arr));
        } else {
            return 
array_shift(array_keys($arr));
        }
    }

    do {
        
$rst TRUE;
        
reset($array);
        while (list(
$oiKey$oiValue) = each($array)) {
            if (
count($oiBludo) == || $rst) {
                
$oiBludo[$oiKey] = $oiValue;
                
$current = &$oiBludo[$oiKey];
                unset(
$array[$oiKey]);
                
$rst FALSE;
                if (
count($array) > 0) {
                    continue;
                } else {
                    unset(
$array);
                    break;
                }
            }
            
$first firstElemKey($oiValue);
            
$cur = &$current[key($current)];
            if (
$cur[id] == $first[id]) {
                (int) 
$cur[db] += (int) $first[db];
                unset(
$oiValue[firstElemKey($oiValueFALSE)]);
                if (
count($oiValue) > 0) {
                    
$current += $oiValue;
                }
                unset(
$array[$oiKey]);
            }
        }
    } while (isset(
$array)); 

Последний раз редактировалось woojin; 26.03.2014 в 14:34.
woojin вне форума Ответить с цитированием
Старый 26.03.2014, 16:41   #8
woojin
Пользователь
 
Регистрация: 20.10.2013
Сообщений: 32
По умолчанию

переделал свой вариант, там обнаружился бесконечный цикл
а вот в таком варианте, всё нормально
PHP код:
    do {
        
$rst TRUE;
        if (
count($array) != 0) {
            
reset($array);
        } else {
            unset(
$array);
        }
        while (list(
$oiKey$oiValue) = each($array)) {
            if (
count($oiBludo) == || $rst) {
                
$oiBludo[$oiKey] = $oiValue;
                
$current = &$oiBludo[$oiKey];
                unset(
$array[$oiKey]);
                
$rst FALSE;
                if (
count($array) > 0) {
                    continue;
                }
            }
            
$first firstElemKey($oiValue);
            
$cur = &$current[key($current)];
            if (
$cur[id] == $first[id]) {
                (int) 
$cur[db] += (int) $first[db];
                unset(
$oiValue[firstElemKey($oiValueFALSE)]);
                if (
count($oiValue) > 0) {
                    
$current += $oiValue;
                }
                unset(
$array[$oiKey]);
            }
        }
    } while (isset(
$array)); 
P.S. для тех кому хочется проверить самому
входящий массив
PHP код:
    $array = array(
        
'4' => Array('i0' => Array('id' => 's_101''db' => '1')),
        
'2' => Array('i1' => Array('id' => 's_699''db' => '1')),
        
'7' => Array('i2' => Array('id' => 's_101''db' => '1')),
        
'17' =>Array('i3' => Array('id' => 's_333''db' => '2')),
        
'3' => Array('i4' => Array('id' => 's_53',  'db' => '1'),
                     
't5' => Array('id' => 's_333''db' => '1'),
                     
't6' => Array('id' => 's_584''db' => '1')),
        
'8' => Array('i7' => Array('id' => 's_216''db' => '2'),
                     
't8' => Array('id' => 's_88',  'db' => '1'),
                     
't9' => Array('id' => 's_85',  'db' => '1'),
                     
't10' =>Array('id' => 's_84',  'db' => '1')),
        
'12' =>Array('i11' =>Array('id' => 's_53',  'db' => '1'),
                     
't12' =>Array('id' => 's_584''db' => '1')),
        
'14' =>Array('i13' =>Array('id' => 's_216''db' => '2'),
                     
't14' => Array('id' => 's_86''db' => '1'),
                     
't15' => Array('id' => 's_84''db' => '1'))
    ); 
исходящий массив
PHP код:
    $control = array(
        
'4' => Array('i0' => Array('id' => 's_101''db' => '2')),
        
'2' => Array('i1' => Array('id' => 's_699''db' => '1')),
        
'17' =>Array('i3' => Array('id' => 's_333''db' => '2')),
        
'3' => Array('i4' => Array('id' => 's_53',  'db' => '2'),
                     
't5' => Array('id' => 's_333''db' => '1'),
                     
't6' => Array('id' => 's_584''db' => '1'),
                     
't12' =>Array('id' => 's_584''db' => '1')),
        
'8' => Array('i7' => Array('id' => 's_216''db' => '4'),
                     
't8' => Array('id' => 's_88',  'db' => '1'),
                     
't9' => Array('id' => 's_85',  'db' => '1'),
                     
't10' =>Array('id' => 's_84',  'db' => '1'),
                     
't14' =>Array('id' => 's_86',  'db' => '1'),
                     
't15' =>Array('id' => 's_84',  'db' => '1'))
    ); 
woojin вне форума Ответить с цитированием
Старый 30.03.2014, 10:59   #9
woojin
Пользователь
 
Регистрация: 20.10.2013
Сообщений: 32
Хорошо

предложили на другом форуме
PHP код:
$map = array();
foreach(
$array as $key => $subarr) {
    list(
$k$i) = each($subarr);
    if (isset(
$map[$i['id']])) {
        
$array[$map[$i['id']][0]][$map[$i['id']][1]]['db'] += $subarr[$k]['db'];
        
array_shift($subarr);
        
$array[$map[$i['id']][0]] += $subarr;
        unset(
$array[$key]);
    }else{
        
$map[$i['id']] = array($key$k);
    }
}
print_r($array); 
работает лучше чем мой вариант
woojin вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Составление массива из элементов других массивов ShaneRouge Паскаль, Turbo Pascal, PascalABC.NET 3 13.01.2013 23:20
Уменьшение размера изображения на php уменьшение качества картинки пример class php jpeg gif png xzxz PHP 2 19.11.2012 11:11
Задать два массива целых чисел: А(12) и В(6). Найти минимальные элементы этих массивов и поменять.... eragon_ua Помощь студентам 5 15.04.2011 07:58
Разделение массива на несколько массивов kpachbiu PHP 14 28.12.2010 16:03
Заполнение массивов массива случайными числами pa6kevi4 Общие вопросы .NET 1 19.05.2010 11:27