За последние 24 часа нас посетил 18491 программист и 1704 робота. Сейчас ищут 874 программиста ...

Подсчитать сумму и записать в предыдущий элемент массива

Тема в разделе "Вопросы от блондинок", создана пользователем Alexir, 2 июн 2010.

  1. Alexir

    Alexir Активный пользователь

    С нами с:
    2 июн 2010
    Сообщения:
    7
    Симпатии:
    0
    Есть список компонентов из которого состоит оборудование,
    1 - поколение дерева готовые детали,
    2 - из чего состоит 1 компонент(кабели ...) но их можно собратиь вручную.
    Массив:

    0 1- cable det = 25 р.
    1 1- cabinet fmodule = 10 р.
    2 1- patch cord = 20 р.
    3 * 2- cable utp= 10 р.
    4 * 2- Connector = 2 р.
    5 1-Cable USB = 40
    6 * 2- E.plata = 15 р.
    7 * 2- cable utp = 3 р.
    8 * 2- Connector = 2 р.
    9 1- cable R = 15.58 р.
    10 * 2- cable UNIT = 11 р.
    11 * 2- Connector = 2 р.

    Как подсчитать сумму во 2-и поколении и записать ее в 1-й уровень.
    н.р. привести к виду
    2 1- patch cord 11 шт. * 20 р. = 220р.(готовые) 132р(собраные)
    3 * 2- cable utp= 10 р.
    4 * 2- Connector = 2 р.
    вот нужно записать новые данные в массив 120р(собраные (10+2)*10 )

    Как выводится
    while ($row=mysql_fetch_array($result))
    {
    $arrow[]=$row;
    $ID1=$row[id];
    $summ= $row[col]*$row[price]
    echo "$ID1.$row[lvl]."-".$row[type].$row[col]."*". $row[price]"=".$summ ;
    }
    Не могу понять как можно сумму 2-го поколения записать в 1-е, т.е. вернуться назад по массиву и обновить данные?
    как все обработать и записать в новый массив и потом его выводить?
    На форуме не нашел похожий вопросов.
     
  2. Alexir

    Alexir Активный пользователь

    С нами с:
    2 июн 2010
    Сообщения:
    7
    Симпатии:
    0
    Я в PHP совсем новичек. поэтому и прошу меня натолкнуть на здравую мысль.

    как можно сделать какую либо метку в определенной строке массива.
    Например, когда сохраняется состояние предыдущей строки из $row[lvl] ==1 в $row[lvl] == 2.
    Подсчитали сумму в $row[lvl] = 2, и дописать $summs

    PHP:
    1.  echo "$ID1.$row[lvl]."-".$row[type].$row[col]."*". $row[price]"="."$summ (gotov)  - $summs (sobr)";  
    2.  
    Оч. надо!!!
     
  3. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Курсач горит? :D

    приводите оригинальное задание а не то что вы понаписали. ничерта не понятно что вам требуется.
     
  4. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Что надо? Посчитать сумму потомков и записать родителю.

    В зависимости от того как хранятся данные можно набросать несколько вариантов:
    1) Если хранить данные в массиве типа:
    PHP:
    1. <?php
    2. $arr=array(
    3.     array('title'=>'Рыба', 'price'=>46, 'parts'=>
    4.         array(
    5.             array ('title'=>'Кости', 'price'=>1, 'parts'=>array()),
    6.             array ('title'=>'Чешуя', 'price'=>1, 'parts'=>array()),
    7.             array ('title'=>'Мясо', 'price'=>40, 'parts'=>array())
    8.         )
    9.     ),
    10.     array('title'=>'Птица', 'price'=>87, 'parts'=>
    11.         array(
    12.             array ('title'=>'Кости', 'price'=>1, 'parts'=>array()),
    13.             array ('title'=>'Перья', 'price'=>1, 'parts'=>array()),
    14.             array ('title'=>'Мясо', 'price'=>80, 'parts'=>array())
    15.         )
    16.     )
    17. //и т.д.
    18. )
    то можно создать рекурсивную функцию, которая будет подсчитывать сумму потомков.
    2)Если хранить в линейном массиве типа:
    PHP:
    1. <?php
    2. $arr=array(
    3.         1=>array('title'=>'Рыба', 'price'=>46, 'pid'=>0),
    4.         2=>array('title'=>'Кости', 'price'=>1, 'pid'=>1),
    5.         3=>array('title'=>'Чешуя', 'price'=>1, 'pid'=>1),
    6.         4=>array('title'=>'Мясо', 'price'=>40, 'pid'=>1),
    7.  
    8.         5=>array('title'=>'Птица', 'price'=>87, 'pid'=>0),
    9.         6=>array('title'=>'Кости', 'price'=>1, 'pid'=>5),
    10.         7=>array('title'=>'Перья', 'price'=>1, 'pid'=>5),
    11.         8=>array('title'=>'Мясо', 'price'=>80, 'pid'=>5)
    12. //и т.д.
    13.     )
    14.  
    то при уровне вложенности не больше 2 можно тупо по pid находить родителя и суммировать в нужное поле.
    3)Если хранить в упорядоченном линейном массиве типа:
    PHP:
    1. <?php
    2. $arr=array(array('id'=>1 'title'=>'Рыба', 'price'=>46, 'lvl'=>1),
    3.         array('id'=>2 'title'=>'Кости', 'price'=>1,  'lvl'=>2),
    4.         array('id'=>3 'title'=>'Чешуя', 'price'=>1, 'lvl'=>2),
    5.         array('id'=>4 'title'=>'Мясо', 'price'=>40, 'lvl'=>2),
    6.  
    7.         array('id'=>5 'title'=>'Птица', 'price'=>87, 'lvl'=>1),
    8.         array('id'=>6 'title'=>'Кости', 'price'=>1, 'lvl'=>2),
    9.         array('id'=>7 'title'=>'Перья', 'price'=>1, 'lvl'=>2),
    10.         array('id'=>8 'title'=>'Мясо', 'price'=>80, 'lvl'=>2)
    11. //и т.д.
    12.     )
    13. //(это Ваш вариант, насколько я понял)
    14.  
    то надо шаманить с
    PHP:
    1. <?php
    2. $curId=-1;
    3. foreach($arr as $part){
    4.     if ($part['lvl']==1){
    5.         if($curId>-1){
    6.             $arr[$curId]['sum']=$curSum;    
    7.         }
    8.         $curSum=0;
    9.         $curId=$part['id']
    10.     }
    11.     else{
    12.         $curSum+=$part['price'];
    13.     }
    14. }
    15. $arr[$curId]['sum']=$curSum;    
    16.  
    17.  
    4) Ну и на закуску: если данные в базе хранить по принципу Redundant Adjacency List, то необходимая информация выбирается в один запрос.
     
  5. Padaboo

    Padaboo Старожил
    Команда форума Модератор

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    Volt(220)
    а ссылка, ссылка где? нарушаем традиции? :D
     
  6. Alexir

    Alexir Активный пользователь

    С нами с:
    2 июн 2010
    Сообщения:
    7
    Симпатии:
    0
    Volt(220)
    Массив то одномерный, но уровней $row[lvl]может быть до 4-х.
    Как можно н.р. сумму($summ2) 3-го уровня записать во 2-й(строк 2 -го уровня несколько, но только в одном есть 3-йуровень), а 2-й в 1-й.
    БД сервировка стола:
    Повторюсь, как подсчитать LVL нижнего уровня и занести их в верхний чтобы порядок выхода данных не испортился.
    Т.е. при выводе (id == 17) должны присутствовать уже все 3 суммы.
    Еще есть примеры, оч. горит?
     
  7. iliavlad

    iliavlad Активный пользователь

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    чего-то данных у вас не хватает...
    а где написано, что дрожжи относятся к пирогу, а не к рому или подносу?
     
  8. Alexir

    Alexir Активный пользователь

    С нами с:
    2 июн 2010
    Сообщения:
    7
    Симпатии:
    0
    iliavlad
    Массив то уже отсортирован в том виде в котором есть, т.е. в данной последовательности(SQL запросом из нескольких таблиц) и приведен к одномерному массиву(так надо).
    и считаем по порядку
    что если перед 2-м lvl стои lvl 1 то все ниже перечисленное к нему и относится, пока не дойдем снова до lvl = 1.
    lvl id
    1 17 пирог 100 100 45 40
    2 18 дрожжи 5 5
    2 11 масло 30 30 25
    3 10 молоко 15
    3 12 сметана 10
    2 13 начинка 10р 10
     
  9. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    0)Я бы все-таки изменил способ хранения данных хотя бы на Adjacency List. Тогда, думаю, найдется много готовых решений в гугле.
    1) Как было сказано выше: Как определяется к какому уровню относиться подуровень?
    2) Если уровней много и сумма первого уровня должна быть равна сумма второго+ сумма третьего + и т.д., то можно усовершенствовать алгоритм в 3) пункте:
    а) Развернуть проход по массиву - идти с конца в начало.
    б) считать сумму пока уровень не изменился.
    в) когда уровень изменился записать сумму в стек
    г) если уровень стал больше (из 2 в 3), то считаем новую сумму
    д) если уровень стал меньше, то вытаскиваем значение из стека, записываем его в элемент, делаем эту сумму текущей
    г) если уровень =1, то обнулить текущую сумму.
     
  10. Alexir

    Alexir Активный пользователь

    С нами с:
    2 июн 2010
    Сообщения:
    7
    Симпатии:
    0
    0) К другому способу не хочется переходить, попробовать обработать в текущем виде.
    1) ни как не относится к подуровням, просто последовательность строк в массиве.
    вот и их и надо разграничить вручную по lvl.
    2)-й пунк согласен.
    а) Как пройти массив с конца?
    Может все результаты сохранять в новый массив, и потом в конце его просто вывести?
    в) как записывать данные в стек и как потом из него извлекать туже сумму?
    И в стек записывать всю строку массива чтобы потом уже с обновленными данными ее выводить.
    по остальным пунктам вроде как понятно.
    Может конечно совсем дурацкие вопросы... но пока полный чайник. Так что сильно просьба не пинать.
    Часть кода в пример, логика понятна, но как это реализовать?
     
  11. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    Можно, конечно, шаманить со всякими _fetch ... Но я бы просто выбрал бы все данные в массив и потом уже работал чисто с ним.

    Можно for'ом от последнего элемента к первому (благо у них числовые индексы).
    (Я люблю работать с массивами foreach'ем, потому использовал бы array_reverse.
    Да, если хочется поизвращаться, то можно заюзать end и prev)

    http://ru.php.net/manual/en/function.array-pop.php
    http://ru.php.net/manual/en/function.array-push.php
    Да и вообще http://ru.php.net/manual/en/book.array.php

    Не совсем понял идею. Стек нам нужен чтобы не присумировать случайно сумму второго уровня третьему.
     
  12. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Alexir
    var_dump покажи какого нить реального массива твоего
     
  13. Alexir

    Alexir Активный пользователь

    С нами с:
    2 июн 2010
    Сообщения:
    7
    Симпатии:
    0
    igordata
    Сумму последующих [lvl] => 2 пишем в [assem] [lvl] => 1
    Код (Text):
    1. [11] => Array
    2.         (
    3.             [0] => 1            [lvl] => 1
    4.             [1] => 1766            [id] => 1766
    5.             [2] => A            [type] => A
    6.             [3] => K            [sub] => K
    7.             [4] => 1            [part] => 1
    8.             [5] => 1            [version] => 1
    9.             [6] => cabinet on module            [name] => cabinet on module
    10.             [7] => 1            [qty] => 1
    11.             [8] => 0            [sumlev] => 0
    12.             [9] => 0            [assem] => 0
    13.             [10] => 0            [crline] => 3
    14.         )
    15.  
    16.     [12] => Array
    17.         (
    18.             [0] => 1            [lvl] => 1
    19.             [1] => 1734            [id] => 1734
    20.             [2] => A            [type] => A
    21.             [3] => W            [sub] => W
    22.             [4] => 5            [part] => 5
    23.             [5] => 1            [version] => 1
    24.             [6] => cable pour DT            [name] => cable pour DT
    25.             [7] => 1            [qty] => 1
    26.             [8] => 0            [sumlev] => 0.074
    27.             [9] => 0            [assem] => 0
    28.             [10] => 0            [crline] => 3
    29.         )
    30.  
    31.     [13] => Array
    32.         (
    33.             [0] => 2            [lvl] => 2
    34.             [1] => 1744            [id] => 1744
    35.             [2] => E            [type] => E
    36.             [3] => W            [sub] => W
    37.             [4] => 2            [part] => 2
    38.             [5] => 1            [version] => 1
    39.             [6] => cable UNI300 CY            [name] => cable UNIT300 CY
    40.             [7] => 1            [qty] => 1
    41.             [8] => 0            [sumlev] => 100
    42.             [9] => 0            [assem] => 0
    43.             [10] => 0            [crline] => 1
    44.         )
    45.  
    46.     [14] => Array
    47.         (
    48.             [0] => 2            [lvl] => 2
    49.             [1] => 1747            [id] => 1747
    50.             [2] => E            [type] => E
    51.             [3] => X            [sub] => X
    52.             [4] => 6            [part] => 6
    53.             [5] => 1            [version] => 1
    54.             [6] => pise M12 fem            [name] => pise M12 fem
    55.             [7] => 1            [qty] => 1
    56.             [8] => 0            [sumlev] => 0
    57.             [9] => 0            [assem] => 0
    58.             [10] => 0            [crline] => 3
    59.         )
    60.  
    61.     [15] => Array
    62.         (
    63.             [0] => 1            [lvl] => 1
    64.             [1] => 1735            [id] => 1735
    65.             [2] => E            [type] => E
    66.             [3] => W            [sub] => W
    67.             [4] => 6            [part] => 6
    68.             [5] => 1            [version] => 1
    69.             [6] => cable pour            [name] => cable pour
    70.             [7] => 2            [qty] => 2
    71.             [8] => 0            [sumlev] => 4.01
    72.             [9] => 0            [assem] => 0
    73.             [10] => 0            [crline] => 3
    74.         )
    75.  
    76.     [16] => Array
    77.         (
    78.             [0] => 2            [lvl] => 2
    79.             [1] => 1746            [id] => 1746
    80.             [2] => E            [type] => E
    81.             [3] => W            [sub] => W
    82.             [4] => 3            [part] => 3
    83.             [5] => 1            [version] => 1
    84.             [6] => Vollt            [name] => Vollt
    85.             [7] => 1            [qty] => 1
    86.             [8] => 0            [sumlev] => 0
    87.             [9] => 0            [assem] => 0
    88.             [10] => 0            [crline] => 3
    89.         )
    90.  
    91.     [17] => Array
    92.         (
    93.             [0] => 2            [lvl] => 2
    94.             [1] => 1742            [id] => 1742
    95.             [2] => A            [type] => A
    96.             [3] => X            [sub] => X
    97.             [4] => 4            [part] => 4
    98.             [5] => 1            [version] => 1
    99.             [6] => embase conn            [name] => embase conn
    100.             [7] => 2            [qty] => 2
    101.             [8] => 0            [sumlev] => 0
    102.             [9] => 0            [assem] => 0
    103.             [10] => 0            [crline] => 3
    104.         )
    105.  
    106.     [18] => Array
    107.         (
    108.             [0] => 2            [lvl] => 2
    109.             [1] => 1743            [id] => 1743
    110.             [2] => A            [type] => A
    111.             [3] => X            [sub] => X
    112.             [4] => 5            [part] => 5
    113.             [5] => 1            [version] => 1
    114.             [6] => pin sertir            [name] => pin sertir
    115.             [7] => 8            [qty] => 8
    116.             [8] => 0            [sumlev] => 0
    117.             [9] => 0            [assem] => 0
    118.             [10] => 0            [crline] => 3
    119.         )
    120.  
    121.     [19] => Array
    122.         (
    123.             [0] => 1            [lvl] => 1
    124.             [1] => 1745            [id] => 1745
    125.             [2] => E            [type] => E
    126.             [3] => W            [sub] => W
    127.             [4] => 7            [part] => 7
    128.             [5] => 1            [version] => 1
    129.             [6] => cable pour            [name] => cable pour
    130.             [7] => 1            [qty] => 1
    131.             [8] => 0            [sumlev] => 6.58
    132.             [9] => 0            [assem] => 0
    133.             [10] => 0            [crline] => 3
    134.         )
     
  14. Alexir

    Alexir Активный пользователь

    С нами с:
    2 июн 2010
    Сообщения:
    7
    Симпатии:
    0
    Может с помощью рекурсии можно как то сделать?