powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / уменьшение массива-массивов
37 сообщений из 37, показаны все 2 страниц
уменьшение массива-массивов
    #38594770
woojin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
всем привет!!!

есть массив
Код: 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.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
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
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.
26.
27.
28.
29.
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
                )
        )
)


уже весь мозг сломал
...
Рейтинг: 0 / 0
уменьшение массива-массивов
    #38595606
SharuPoNemnogu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
woojin,

Зачем же делать такие "страшные" данные, чтобы потом сидеть и с ними мучиться. Откуда вы их получаете, может можно до получения массива привести все в человеческий вид?
...
Рейтинг: 0 / 0
уменьшение массива-массивов
    #38596086
woojin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
нельзя, т.к. их формирует JS который трогать нельзя ((((
...
Рейтинг: 0 / 0
уменьшение массива-массивов
    #38596099
artas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
woojin,
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
$new_arr = array();
foreach ($arr as $k=>$v){
   foreach ($v as $k1=>$v1){
        if(!isset($new_arr[$v['id']])){
            $new_arr[$v1['id']] = 0;
        }
        $new_arr[$v1['id']] += $v1['db'];
    }
}
print_r($new_arr);



может такой вариант устроит ? (не проверял)
...
Рейтинг: 0 / 0
уменьшение массива-массивов
    #38596112
artas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
artas,

в Иф там $v1
...
Рейтинг: 0 / 0
уменьшение массива-массивов
    #38596411
woojin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
artaswoojin,
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
$new_arr = array();
foreach ($arr as $k=>$v){
   foreach ($v as $k1=>$v1){
        if(!isset($new_arr[$v1['id']])){
            $new_arr[$v1['id']] = 0;
        }
        $new_arr[$v1['id']] += $v1['db'];
    }
}
print_r($new_arr);



может такой вариант устроит ? (не проверял)
все прибавилось к текстовому элементу ID
и не сохранился элемент DB
...
Рейтинг: 0 / 0
уменьшение массива-массивов
    #38596480
woojin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в общем это работает
Код: 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.
26.
27.
28.
    do {
        $rst = TRUE;
        reset($array);
        while (list($oiKey, $oiValue) = each($array)) {
            if (count($oiBludo) == 0 || $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($oiValue, FALSE)]);
                if (count($oiValue) > 0) {
                    $current += $oiValue;
                }
                unset($array[$oiKey]);
            }
        }
    } while (isset($array));
...
Рейтинг: 0 / 0
уменьшение массива-массивов
    #38596940
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
woojin,

както сложно.
так не пойдет?
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
$tmpa = array();
foreach($arr as $v) {
    foreach($v as $kk=>$vv) {
        if (!isset($tmpa[$vv['id']])) {
            $tmpa[$vv['id']]['db'] = $vv['db'];
            $tmpa[$vv['id']]['k'] = $kk;
        } else {
            $tmpa[$vv['id']]['db'] += $vv['db'];
        }
    }
}
$out = array();
foreach($tmpa as $k=>$v) {
    $out[$v['k']]['id'] = $k;
    $out[$v['k']]['db'] = $v['db'];
}
echo '<pre>';
print_r($out);// результат!
...
Рейтинг: 0 / 0
уменьшение массива-массивов
    #38597082
woojin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
r uтак не пойдет?
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
$tmpa = array();
foreach($arr as $v) {
    foreach($v as $kk=>$vv) {
        if (!isset($tmpa[$vv['id']])) {
            $tmpa[$vv['id']]['db'] = $vv['db'];
            $tmpa[$vv['id']]['k'] = $kk;
        } else {
            $tmpa[$vv['id']]['db'] += $vv['db'];
        }
    }
}
$out = array();
foreach($tmpa as $k=>$v) {
    $out[$v['k']]['id'] = $k;
    $out[$v['k']]['db'] = $v['db'];
}
echo '<pre>';
print_r($out);// результат!


работает не верно (хотя мой то же), и переставляет элементы непонятным образом
массив для тестов (на входе)
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
    $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
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
    $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' => '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'))
                    );
...
Рейтинг: 0 / 0
уменьшение массива-массивов
    #38597086
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
woojin,

что-то всё очень сложно ))

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
$resArr = array();
foreach($iArr as $iSubArr){
  foreach($iSubArr as $el){
    if(!isset($resArr[$el['id']])){
      $resArr[$el['id']]['db']=$el['db']; 
      $resArr[$el['id']]['id']=$el['id'];
    }else{
      $resArr[$el['id']]+=$el['db'];
    }
  }
}



Я так понимаю ключи массива не значимы... значимы только значения id. (просто иначе я не понимаю почему выбраны именно t1, t2, t4, а не t7 например)
...
Рейтинг: 0 / 0
уменьшение массива-массивов
    #38597113
woojin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
немного ошибся, контрольный массив должен быть таким
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
    $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'))
                    );
...
Рейтинг: 0 / 0
уменьшение массива-массивов
    #38597121
woojin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Програмёрwoojin,
Я так понимаю ключи массива не значимы... значимы только значения id.
да, извиняй что сразу об этом как то забыл упомянуть
...
Рейтинг: 0 / 0
уменьшение массива-массивов
    #38597187
woojin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
переделал свой вариант, там обнаружился бесконечный цикл
а вот в таком варианте, всё нормально
Код: 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.
26.
27.
28.
29.
    do {
        $rst = TRUE;
        if (count($array) != 0) {
            reset($array);
        } else {
            unset($array);
        }
        while (list($oiKey, $oiValue) = each($array)) {
            if (count($oiBludo) == 0 || $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($oiValue, FALSE)]);
                if (count($oiValue) > 0) {
                    $current += $oiValue;
                }
                unset($array[$oiKey]);
            }
        }
    } while (isset($array));
...
Рейтинг: 0 / 0
уменьшение массива-массивов
    #38597377
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
woojin,

А зачем такая сложность кода? Чем не подошли предложенные варианты?
...
Рейтинг: 0 / 0
уменьшение массива-массивов
    #38597466
woojin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Програмёр,

я же тут( 15789883 ) показал пример выходного массива
и при использовании приведённых примеров кода, такой варианта не получается
...
Рейтинг: 0 / 0
уменьшение массива-массивов
    #38597547
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
woojinПрограмёр,

я же тут( 15789883 ) показал пример выходного массива
и при использовании приведённых примеров кода, такой варианта не получается

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

Тут телепатов нету :) Если поясните принцип формирования выходного массива, и что в указанном примере значимое, а какими данными можно пренебречь (ну имеется ввиду например внешние ключи значения не имеют... или порядок значения не имеет... или ещё что), вот тогда Вам обязательно помогут... и при том внятным нормальным кодом...

В Вашем варианте много непонятного:

1. Зачем в случае пустого массива удалять на него ссылку? что бы усложнить отлов ошибки, когда начнут сыпаться варнинги типа $array не является массивом?

2. $rst = FALSE; ... $rst в принципе не нужен.. участок кода отработается только 1 раз, так как при первом вызове $oiBludo[$oiKey] = $oiValue; количество элементов в данном массиве будет больше нуля... и данный блок повторно уже не будет выполняться...

3 косметического характера, но всё же... я бы матерился, достанься мне такой код :) (int) $cur[db] += (int) $first[db]; Зачем приведение типов? php - это php ... и лишние int тут только глаза мозолят... если операция "+=", то уже понятно что речь о числах идёт. А ещё интереснее момент, когда в коде появится константа db. Как Вы думаете, что произойдёт с кодом? в частности с этой строкой например? :)

4. Чёто не нашёл документации на функцию firstElemKey, но по названию и смыслу в коде предположу, что возвращает первый ключ ассоциативного массива. unset($oiValue[firstElemKey($oiValue, FALSE)]); очень удачно превращается в array_shift($oiValue)

5. $current += $oiValue; работаем с числами? а... нет $cur = &$current[key($current)]; ... оказывается это массивы... логика - если в языке есть возможность, это не значит что её надо пользовать там, где она внесёт хаос. $current = array_merge($current, $oiValue); ведь так сразу понятно что массивы? и не надо по коду бегать и искать что же мы делаем операцией + и какие там у нас типы...


Итак... всё что я написал - не в обиду... Просто хотел показать сколько в Вашем коде лишнего и непонятного. Не знаю как остальным, а вот мне не совсем понятна суть всего кода в целом, при взгляде на него. А это уже плохо, если кроме Вас никто не может понять код... Это говорит о том, что спустя год и Вы его уже не поймёте :)

P.S. Кстати... а я вот не понял как же Вы продвигаетесь внутри вложенных массивов? $cur = &$current[key($current)]; тут такое дело, что $current задан только один раз (вот какраз тот единственный раз когда выполнится участок кода в начале цикла), а потом $cur указывает чётко на выбранный элемент того самого массива (вложенного), при том никакие next не вызываются, а потому и key возвращает всё то же значение. нет?
А с этого следует простой вопрос... А Ваш код вообще работает? или Вы его закинули в надежде получить готовый ответ, при том что код заведомо неверный?

P.P.S. Почему в контрольном массиве по последним Вашим данным повторяются некоторые id элементов (например s_584 дважды... и s_84 тоже дважды)? А ещё интереснее... проверил Ваш код :) на выходе в $oiBludo совсеееем не то, что Вами описано было )) там s_101 повторился 2 раза (дальше не стал уже вникать... лень). Это не говоря о тех трёх десятках notice которые мне засветил интерпретатор (кстати, часть из них - это несуществующие элементы массивы с ключами 'id' и 'bd'. Вообще удивляюсь что код хоть что-то выводит ). Всё... окончательно убедился что написан говнокод :) Только теперь усомнился в добросовестности автора топика (похоже он ничего не делал и выдрал код непонятно откуда, где его суть была совсем другая... ну или просто накидал быстро что-нибудь, что бы сюда разместить)
...
Рейтинг: 0 / 0
уменьшение массива-массивов
    #38597574
woojin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я же писал выше, что такие ключи формируются JS'ом ( 15785105 ) который трогать нельзя
основной смысл в том чтобы получить, данные из вложенного массива (у которого есть в индексе буква "i") из поля id и сравнить со всеми остальными такими же полями, при совпадении прибавить к полю с индексом db столько сколько написано в поле db у найденного элемента

1. удалять чтобы выйти из цикла DO {} WHILE
2. тут скорее не нужен count($oiBludo) == 0 , т.к. участок кода отрабатывает не один раз, а несколько раз по количеству элементов массива, перемещение по массиву идёт от начала к концу и по мере внесения данных в $oiBludo в исходном массиве эти данные удаляются
3. во-первых: если таким += образом сложить текстовые величины (а они текстовые), то это получится что строка просто увеличится (отработает ни как 1+2=3, а как 1+2=12)
во-вторых: db это не константа!!! (я в константах php такой не видел - покажите пожалуйста) и с этой строкой ни чего не происходит, т.к. она работает на УРА! тут получается что db это обозначение индекса
4. согласен, тут сплоховал, вот исходник:
Код: php
1.
2.
3.
4.
5.
6.
7.
    function firstElemKey($arr, $ElemKey = TRUE) {
        if ($ElemKey) {
            return array_shift(array_values($arr));
        } else {
            return array_shift(array_keys($arr));
        }
    }


5. тут тоже согласен можно применить и array_merge , но в общем то не такой уж и большой код, чтобы в нём можно было запутаться

P.S. ни как не продвигаюсь, я сравниваю только первые элементы, у которых в индексе есть буква "i", а остальные просто дописываю/переношу в получившийся массив, код рабочий, я выше выложил пример входящего массива (это не самое первое сообщение) и исходящего, если Вас не затруднит (чисто для себя), то можете взять мой код, входящий массив прогнать через него и получите исходящий

P.P.S. по поводу одинаковых id , если внимательно посмотреть, то они находятся вообще в разных массивах (это если смотреть в любой из массивов, входящий/исходящий(конкретно тут из исходящего))
Код: php
1.
2.
3.
4.
5.
6.
7.
'3' => Array('i4' => Array('id' => 's_53',  'db' => '2'),
                                't6' => Array('id' => 's_584', 'db' => '1'),
                                't12' =>Array('id' => 's_584', 'db' => '1')),
............................................................................................
'8' => Array('i7' => Array('id' => 's_216', 'db' => '4'),
                                't10' =>Array('id' => 's_84',  'db' => '1'), 
                                't15' =>Array('id' => 's_84',  'db' => '1'))


интересно посмотреть где они выдаются (реально интересно, у меня просто даже при включенных ошибках нет ничего)
согласен может быть и говнокод, написан мной лично, а выложен он сюда не для оскорблений , а для указания на ошибки и предложения своего варианта для решения поставленной задачи
а поскольку ни кто ничего путного (того что могло бы создать контрольный массив на выходе), не предложил то можно считать что этот код работает идеально и на 100%
...
Рейтинг: 0 / 0
уменьшение массива-массивов
    #38597597
Програмёр
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
woojinя же писал выше, что такие ключи формируются JS'ом ( 15785105 ) который трогать нельзя
основной смысл в том чтобы получить, данные из вложенного массива (у которого есть в индексе буква "i") из поля id и сравнить со всеми остальными такими же полями, при совпадении прибавить к полю с индексом db столько сколько написано в поле db у найденного элемента

1. удалять чтобы выйти из цикла DO {} WHILE
2. тут скорее не нужен count($oiBludo) == 0 , т.к. участок кода отрабатывает не один раз, а несколько раз по количеству элементов массива, перемещение по массиву идёт от начала к концу и по мере внесения данных в $oiBludo в исходном массиве эти данные удаляются
3. во-первых: если таким += образом сложить текстовые величины (а они текстовые), то это получится что строка просто увеличится (отработает ни как 1+2=3, а как 1+2=12)
во-вторых: db это не константа!!! (я в константах php такой не видел - покажите пожалуйста) и с этой строкой ни чего не происходит, т.к. она работает на УРА! тут получается что db это обозначение индекса
4. согласен, тут сплоховал, вот исходник:
Код: php
1.
2.
3.
4.
5.
6.
7.
    function firstElemKey($arr, $ElemKey = TRUE) {
        if ($ElemKey) {
            return array_shift(array_values($arr));
        } else {
            return array_shift(array_keys($arr));
        }
    }


5. тут тоже согласен можно применить и array_merge , но в общем то не такой уж и большой код, чтобы в нём можно было запутаться

P.S. ни как не продвигаюсь, я сравниваю только первые элементы, у которых в индексе есть буква "i", а остальные просто дописываю/переношу в получившийся массив, код рабочий, я выше выложил пример входящего массива (это не самое первое сообщение) и исходящего, если Вас не затруднит (чисто для себя), то можете взять мой код, входящий массив прогнать через него и получите исходящий

P.P.S. по поводу одинаковых id , если внимательно посмотреть, то они находятся вообще в разных массивах (это если смотреть в любой из массивов, входящий/исходящий(конкретно тут из исходящего))
Код: php
1.
2.
3.
4.
5.
6.
7.
'3' => Array('i4' => Array('id' => 's_53',  'db' => '2'),
                                't6' => Array('id' => 's_584', 'db' => '1'),
                                't12' =>Array('id' => 's_584', 'db' => '1')),
............................................................................................
'8' => Array('i7' => Array('id' => 's_216', 'db' => '4'),
                                't10' =>Array('id' => 's_84',  'db' => '1'), 
                                't15' =>Array('id' => 's_84',  'db' => '1'))


интересно посмотреть где они выдаются (реально интересно, у меня просто даже при включенных ошибках нет ничего)
согласен может быть и говнокод, написан мной лично, а выложен он сюда не для оскорблений , а для указания на ошибки и предложения своего варианта для решения поставленной задачи
а поскольку ни кто ничего путного (того что могло бы создать контрольный массив на выходе), не предложил то можно считать что этот код работает идеально и на 100%



Ещё раз уточню, что не пытаюсь обидеть или оскорбить... просто критикую код с точки зрения стороннего программиста, который пытается в нём разобраться :)

1. Легче проверить count($array); (избавимся от лишних строк и как минимум от одного нотиса "invalid argument in foreach" (по-моему так там пишет))
2. Ну тут не сильно важно :) просто явно есть лишнее... оба условия будут всегда одинаковы... потому одно убрать можно :)
3.1. в пхп конкатинация строк производится через точку (пример $a.$b). Потому $a+$b - это сумма чисел :) Как строки в пхп такие переменные рассматриваться не будут. А значит даже если $a и $b изначально строки, то результат "2"+"1" будет не "21", а 3 :)
3.2. резервированное слово != константа.... я об define("db", "my constant");
4. ...
5. запутаться то нет... но это же вопрос удобства... есть разница в чтении 10 строк по 20 символов и 10 строк по 120? )))

ответ на P.S.
Я как-раз взял Ваш код, прогнал входящий массив (последний из представленных входящих), а на выходе массив $control не получил :) Было как минимум одно отличие... дальше не пошёл...

ответ на P.P.S.
в гугле "php online". Второй и третий результат поиска (не первый... там он багнутый какой-то, рабочий код не всегда нормально работает). Так вот... а на этих двух нормальных сервисах Вы увидите нотисы (лично я проверял на PHP Sandbox). У Вас вывод ошибок включён, а вот вывод нотисов и варнингов - нет :)

Сейчас уже поздно... а вот завтра попытаюсь вникнуть в результирующий массив (как он всё же формируется) и возможно смогу предоставить свой вариант кода.

Однако интересующим меня вопросом остаётся что из представленного результирующего массива не является обязательным? ну то есть его надо в точности повторить? или последовательность элементов можно менять, а ключи вообще не требуются нигде? :) я вот о чём...
...
Рейтинг: 0 / 0
уменьшение массива-массивов
    #38597608
woojin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
1. согласен
2. ...
3.1. да.... видимо запамятовал
3.2. нет такого define - проверено
4. ...
5. дык тут в строках и не по 120 символов ))))) (будем считать что этот вопрос то же закрыли)

6. (ответ на P.S.) посмотреть бы что именно вводилось и что именно получилось, т.к. тут в теме, два массива control , первый который идёт вместе с массивом array ( 15789883 ) он не верный, а вот после него ( 15790001 ) уже верный

7. (ответ на P.P.S.) для информации, не пользуюсь он-лайн сервисами, все тестирования провожу на локальном (домашнем сервере) использую NetBeans, в настройка php error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
ПрограмёрОднако интересующим меня вопросом остаётся что из представленного результирующего массива не является обязательным? ну то есть его надо в точности повторить? или последовательность элементов можно менять, а ключи вообще не требуются нигде? :) я вот о чём...
последовательность 4, 2, 7, 17..... должна быть сохранена (как видно на "выходном", массива с индексом 7 уже нет - так и должно быть; 7 прибавился к 4)
и так же должны остаться первыми массивы с индексом "i", т.е. они не должны быть перемещены в конец или середину
входной
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
'4' => Array('i0' => .............
                   '2' => Array('i1' => .............
                   '7' => Array('i2' => .............
                   '17' =>Array('i3' => .............
                   '3' => Array('i4' => .............
                   '8' => Array('i7' => .............
                   '12' =>Array('i11' => .............
                   '14' =>Array('i13' => .............


выходной
Код: php
1.
2.
3.
4.
5.
'4' => Array('i0' => .............
                   '2' => Array('i1' => .............
                   '17' =>Array('i3' => .............
                   '3' => Array('i4' => .............
                   '8' => Array('i7' => .............


остальные элементы с индексом "t" могут перемещаться как угодно в пределах своего массива

P.S. ну вроде бы всё разъяснил
...
Рейтинг: 0 / 0
уменьшение массива-массивов
    #38597614
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
woojin,

описание у вас очень путанное. постоянно добавляете новые условия и ограничения. сами не можете привести массив который должен получиться(уже три варианта привели, и не факт что не приведете еще). логики в поведении ключей почти нет. в одном месте их складываем , тут же в другом они не складываются, хотя ключи одинаковые есть....
имея такое описание - решение делать дело неблагодарное. ибо опять может появится новое условие - и алгоритм окажется неверным.
...
Рейтинг: 0 / 0
уменьшение массива-массивов
    #38597625
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
woojin,
кстати, на каком основании у вас элемент:
14=array(
't14' =>Array('id' => 's_86', 'db' => '1'),
)
попал в итоге в массив 8:
8=array(
't14' =>Array('id' => 's_86', 'db' => '1'),
)

??????

ключ s_86 нигде больше не повторяется. нискем не складывается.
следовательно он должен остаться в массиве с ключем 14!
...
Рейтинг: 0 / 0
уменьшение массива-массивов
    #38597627
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если это так, то вот еще вариант:
Код: 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.
26.
27.
28.
29.
30.
31.
32.
33.
$tmp_i = $tmp_t = array();
foreach($arr as $k=>$v) {
    foreach($v as $kk=>$vv) {
        if ($kk{0}=='i') { //i
            if (!isset($tmp_i[$vv['id']])) {
                $tmp_i[$vv['id']]['db'] = $vv['db'];
                $tmp_i[$vv['id']]['k1'] = $k;
                $tmp_i[$vv['id']]['k2'] = $kk;
            } else {
                $tmp_i[$vv['id']]['db'] += $vv['db'];
            }
        } else { // t
            $tmp_t[$vv['id']][$kk]['db'] = $vv['db'];
            $tmp_t[$vv['id']][$kk]['k1'] = $k;
            $tmp_t[$vv['id']][$kk]['k2'] = $kk;
        }
    }//for
}//for
$out = array();
foreach($tmp_i as $k=>$v) {
    $out[$v['k1']][$v['k2']]['id'] = $k;
    $out[$v['k1']][$v['k2']]['db'] = $v['db'];
}//for
foreach($tmp_t as $k=>$v) {
    $tk = false;
    foreach($v as $kk=>$vv ) {
        if (!$tk) $tk = $vv['k1'];
        $out[$tk][$vv['k2']]['id'] = $kk;
        $out[$tk][$vv['k2']]['db'] = $vv['db'];
    }//for
}//for
echo '<pre>';
print_r($out);
...
Рейтинг: 0 / 0
уменьшение массива-массивов
    #38597653
woojin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
r uуже три варианта привели
я же привёл сообщение в котором 100% правильный вариант выходного массива, а какие во входном массиве могут быть данные (конкретно цифры после "s_").... ну это же бог его знает, я же не буду сюда весь набор закидывать (если мне память не изменяет их там больше 500)

P.S. первый (в первом сообщении) приведённый мной массив был просто тестовым с ну очень похожими данными, извините если прям всех так на него тянет
...
Рейтинг: 0 / 0
уменьшение массива-массивов
    #38597658
woojin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
r uwoojin,
кстати, на каком основании у вас элемент:
14=array(
't14' =>Array('id' => 's_86', 'db' => '1'),
)
попал в итоге в массив 8:
8=array(
't14' =>Array('id' => 's_86', 'db' => '1'),
)

??????

ключ s_86 нигде больше не повторяется. нискем не складывается.
следовательно он должен остаться в массиве с ключем 14!
на основании того что у него верхний элемент (i13) имеет 'id' => 's_216'
совпадающий с 'i7' => Array('id' => 's_216', 'db' => '2'),
...
Рейтинг: 0 / 0
уменьшение массива-массивов
    #38597694
Фотография r u
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
woojinна основании того что у него верхний элемент (i13) имеет 'id' => 's_216'
совпадающий с 'i7' => Array('id' => 's_216', 'db' => '2'),
ну вот пожалуйста. появилось новое условие, о котором ранее небыло сообщено.
...
Рейтинг: 0 / 0
уменьшение массива-массивов
    #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
37 сообщений из 37, показаны все 2 страниц
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / уменьшение массива-массивов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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