powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / уменьшение массива-массивов
12 сообщений из 37, страница 2 из 2
уменьшение массива-массивов
    #38597757
woojin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
извините, я думал это было понятно
...
Рейтинг: 0 / 0
уменьшение массива-массивов
    #38597758
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
woojinизвините, я думал это было понятно
я тоже думал что понял наконец все))
...
Рейтинг: 0 / 0
уменьшение массива-массивов
    #38597833
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
думаю смогу въехать в принцип формирования выходного массива, если поясните как t12 переплыл из элемента с ключом 12 в элемент с ключом 3 :)
...
Рейтинг: 0 / 0
уменьшение массива-массивов
    #38598507
woojin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Програмёрдумаю смогу въехать в принцип формирования выходного массива, если поясните как t12 переплыл из элемента с ключом 12 в элемент с ключом 3 :)
у них id = s_53 у обоих, по этому у первого db стало больше на количество указанное в db второго
...
Рейтинг: 0 / 0
уменьшение массива-массивов
    #38598655
MikkiMouse
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
woojin,

Жжешь. Почти как наши заказчики. Завтра, насколько я понимаю, условие задачи еще немного видоизменится. :)
...
Рейтинг: 0 / 0
уменьшение массива-массивов
    #38598810
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
woojinПрограмёрдумаю смогу въехать в принцип формирования выходного массива, если поясните как t12 переплыл из элемента с ключом 12 в элемент с ключом 3 :)
у них id = s_53 у обоих, по этому у первого db стало больше на количество указанное в db второго

вообще-то у них s_584 :) Но тогда интересует почему t12, а не t6 (ведь в элементе с ключом 3 находится именно t6 с таким значением). Как было сказано можно менять порядок ключей "t..", но в данном случае поменялся не порядок ключей, а именно значение ключа. Так значит ключи "t.." вообще не важны как таковые и могут быть любыми?
...
Рейтинг: 0 / 0
уменьшение массива-массивов
    #38598865
woojin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Програмёрвообще-то у них s_584 :) Но тогда интересует почему t12, а не t6 (ведь в элементе с ключом 3 находится именно t6 с таким значением). Как было сказано можно менять порядок ключей "t..", но в данном случае поменялся не порядок ключей, а именно значение ключа. Так значит ключи "t.." вообще не важны как таковые и могут быть любыми?

наверное я опять что то не так сказал (мне кажется я где то выше упоминал), надо складывать db у тех элементов у которых в индексе есть i* , а все остальные (у которых t* ), просто добавлять в конец массива и элемент с индексом i* , всегда-обязательно должен быть первым
...
Рейтинг: 0 / 0
уменьшение массива-массивов
    #38599019
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
woojinПрограмёрвообще-то у них s_584 :) Но тогда интересует почему t12, а не t6 (ведь в элементе с ключом 3 находится именно t6 с таким значением). Как было сказано можно менять порядок ключей "t..", но в данном случае поменялся не порядок ключей, а именно значение ключа. Так значит ключи "t.." вообще не важны как таковые и могут быть любыми?

наверное я опять что то не так сказал (мне кажется я где то выше упоминал), надо складывать db у тех элементов у которых в индексе есть i* , а все остальные (у которых t* ), просто добавлять в конец массива и элемент с индексом i* , всегда-обязательно должен быть первым

УРА ))) наконец-то сошлось (про складывания элементов только с индексом "i*" вы ещё не говорили) :)

1. есть двухмерный массив (точнее массив массивов) объектов "array(array('имя' => array('id', 'db')) [, array('имя' => array('id', 'db'))])". Пускай ключ такого вложенного массива будем называть именем объекта, а внутренние массивы (в которых лежат объекты) назовём группами... тогда ...
2. Группы в которых есть объекты с именем формата "i*" и одинаковыми 'id' сливаются.
3. При сливании групп все объекты кроме первого с одинаковыми 'id' и именем формата "i*" удаляются, а значение "db" оставшегося (с именем "i*") объекта заменяется суммой значений всех элементов с данным 'id'.

Вот правила. которые Вы так старались описать :) С этой частью закончили... следующее...
Может ли в одной группе быть 2 или более элементов с именем "I*"?
Если может, то как проводить слияние таких групп в случае (?):
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
array(
  1 => array(
    "i1" => array("id" => "s_1", "db" =>"1"),
    "i2" => array("id" => "s_2", "db" =>"1"),
  ),
  2 => array(
    "i1" => array("id" => "s_2", "db" =>"1"),
    "i2" => array("id" => "s_3", "db" =>"1"),
  ),
  3 => array(
    "i1" => array("id" => "s_1", "db" =>"1"),
    "i2" => array("id" => "s_3", "db" =>"1"),
  ),
)



то есть любые две группы могут быть слиты в одну? будем ли мы сливать их все в одну? или как-то попарно? или такой вариант вообще не возможен?

и ещё... если у нас есть 2 объекта с одинаковым именем формата "t*" в группах, которые сливаются, как поступить с такими объектами? ведь мы их не сливаем... но если не проделать какие либо доп. операции, то из всех одноимённых объектов в группе останется только один.
...
Рейтинг: 0 / 0
уменьшение массива-массивов
    #38599552
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
    $tmp = array();
    foreach($array as $key=>$group){
      $iArr = reset($group);
      if(!array_key_exists($iArr['id'], $tmp)){
        $tmp[$iArr['id']] = array(
          'key'   => $key,
          'db'    => $iArr['db'],
          'fname' => key($group)
        );
        //переписываем во временный массив срезая первый (значимый) элемент группы
        $tmp[$iArr['id']] = array_merge($tmp[$iArr['id']], array_slice($group, 1));
      }else{
        //вливаем во временный массив срезая первый (значимый) элемент группы
        $tmp[$iArr['id']] = array_merge($tmp[$iArr['id']], array_slice($group, 1));
        $tmp[$iArr['id']]['db'] += $iArr['db'];
      }
    }
    
    //тут приводим временный массив к нужному нам формату
    $res = array();
    foreach($tmp as $id=>$group){
      $firstObj = array();
      $firstObj[$group['fname']] = array('id'=>$id, 'db'=>$group['db']);
      $res[$group['key']] = array_merge($firstObj, array_slice($group, 3));
    }



Это код замечу не айс, думаю тут могут в разы лучше написать :) Но всё же это менее путано чем у Вас ;)

На выходе нужный массив... при этом везде рассчитано на соблюдение условия, что элементы с ключом i* идут первыми (то есть мы их в группе не ищем, а сразу знаем что они первые).
...
Рейтинг: 0 / 0
уменьшение массива-массивов
    #38599705
woojin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПрограмёрМожет ли в одной группе быть 2 или более элементов с именем "I*"?
не может, всегда только 1 элемент, а вот элементов "t*" может быть сколько угодно
Програмёресли у нас есть 2 объекта с одинаковым именем формата "t*" в группах, которые сливаются, как поступить с такими объектами? ведь мы их не сливаем... но если не проделать какие либо доп. операции, то из всех одноимённых объектов в группе останется только один.
такого тоже быть не может, т.к. (смотрим на входящий массив), все элементы идут с цифрой которая всегда больше предыдущей (у элементов i* и t* вообще получается сквозная нумерация)
ПрограмёрЭто код замечу не айс, думаю тут могут в разы лучше написать :) Но всё же это менее путано чем у Вас ;)

На выходе нужный массив... при этом везде рассчитано на соблюдение условия, что элементы с ключом i* идут первыми (то есть мы их в группе не ищем, а сразу знаем что они первые).
на другом форуме дали более изящное решение. чем моё и Ваше
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
$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);
    }
}
echo '<pre>$array='.print_r($array, true).'<pre>';


вот такую корректировку внёс уже я, заменил $array[$map[$i['id']][0]] на ссылочную переменную $tmp
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
$map = array();
foreach($array as $key => $subarr) {
    list($k, $i) = each($subarr);
    if (isset($map[$i['id']])) {
        $tmp = &$array[$map[$i['id']][0]];
        $tmp[$map[$i['id']][1]]['db'] += $subarr[$k]['db'];
        array_shift($subarr);
        $tmp = array_merge($tmp, $subarr);
        unset($array[$key]);
    }else{
        $map[$i['id']] = array($key, $k);
    }
}
echo '<pre>$array='.print_r($array, true).'<pre>';
...
Рейтинг: 0 / 0
уменьшение массива-массивов
    #38599748
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
woojin,

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
<?php
function group_merge(&$array, $g1, $g2, $oName1, $oName2){
  $array[$g1][$oName1]['db']+=$array[$g2][$oName2]['db'];
  $array[$g1] = array_merge($array[$g1], array_slice($array[$g2], 1));
  unset($array[$g2]);
}
                  
$keys = array();
foreach($array as $key => $subarr) {
    list($k, $i) = each($subarr);
    $i = $i['id'];
    if(!isset($keys[$i])){
      $keys[$i] = array($key, $k);
    }else{
      group_merge($array, $keys[$i][0], $key, $keys[$i][1], $k);
    }
}
echo '<pre>$array='.print_r($array, true).'<pre>';
?>



Мне показалось удобным выделить операцию слияния групп в функцию. Ну это на Ваше усмотрение (просто мне такой код кажется удобнее).
А вообще, Вам дали вполне достойный вариант :) В общем даже придраться нету к чему...
...
Рейтинг: 0 / 0
уменьшение массива-массивов
    #38599942
woojin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Програмёрwoojin,
А вообще, Вам дали вполне достойный вариант :) В общем даже придраться нету к чему...
и я так же подумал - спасибо за участие
...
Рейтинг: 0 / 0
12 сообщений из 37, страница 2 из 2
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / уменьшение массива-массивов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]