Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / уменьшение массива-массивов / 25 сообщений из 37, страница 1 из 2
24.03.2014, 15:38
    #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
25.03.2014, 12:47
    #38595606
SharuPoNemnogu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
уменьшение массива-массивов
woojin,

Зачем же делать такие "страшные" данные, чтобы потом сидеть и с ними мучиться. Откуда вы их получаете, может можно до получения массива привести все в человеческий вид?
...
Рейтинг: 0 / 0
25.03.2014, 17:18
    #38596086
woojin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
уменьшение массива-массивов
нельзя, т.к. их формирует JS который трогать нельзя ((((
...
Рейтинг: 0 / 0
25.03.2014, 17:23
    #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
25.03.2014, 17:28
    #38596112
artas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
уменьшение массива-массивов
artas,

в Иф там $v1
...
Рейтинг: 0 / 0
25.03.2014, 22:32
    #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
26.03.2014, 01:26
    #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
26.03.2014, 14:01
    #38596940
r u
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
26.03.2014, 15:36
    #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
26.03.2014, 15:40
    #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
26.03.2014, 15:53
    #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
26.03.2014, 15:57
    #38597121
woojin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
уменьшение массива-массивов
Програмёрwoojin,
Я так понимаю ключи массива не значимы... значимы только значения id.
да, извиняй что сразу об этом как то забыл упомянуть
...
Рейтинг: 0 / 0
26.03.2014, 16:40
    #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
26.03.2014, 19:10
    #38597377
Програмёр
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
уменьшение массива-массивов
woojin,

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

я же тут( 15789883 ) показал пример выходного массива
и при использовании приведённых примеров кода, такой варианта не получается
...
Рейтинг: 0 / 0
26.03.2014, 23:57
    #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
27.03.2014, 01:22
    #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
27.03.2014, 03:11
    #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
27.03.2014, 05:30
    #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
27.03.2014, 06:23
    #38597614
r u
r u
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
уменьшение массива-массивов
woojin,

описание у вас очень путанное. постоянно добавляете новые условия и ограничения. сами не можете привести массив который должен получиться(уже три варианта привели, и не факт что не приведете еще). логики в поведении ключей почти нет. в одном месте их складываем , тут же в другом они не складываются, хотя ключи одинаковые есть....
имея такое описание - решение делать дело неблагодарное. ибо опять может появится новое условие - и алгоритм окажется неверным.
...
Рейтинг: 0 / 0
27.03.2014, 07:15
    #38597625
r u
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
27.03.2014, 07:21
    #38597627
r u
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
27.03.2014, 08:40
    #38597653
woojin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
уменьшение массива-массивов
r uуже три варианта привели
я же привёл сообщение в котором 100% правильный вариант выходного массива, а какие во входном массиве могут быть данные (конкретно цифры после "s_").... ну это же бог его знает, я же не буду сюда весь набор закидывать (если мне память не изменяет их там больше 500)

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


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