Есть список компонентов из которого состоит оборудование, 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-е, т.е. вернуться назад по массиву и обновить данные? как все обработать и записать в новый массив и потом его выводить? На форуме не нашел похожий вопросов.
Я в PHP совсем новичек. поэтому и прошу меня натолкнуть на здравую мысль. как можно сделать какую либо метку в определенной строке массива. Например, когда сохраняется состояние предыдущей строки из $row[lvl] ==1 в $row[lvl] == 2. Подсчитали сумму в $row[lvl] = 2, и дописать $summs PHP: echo "$ID1.$row[lvl]."-".$row[type].$row[col]."*". $row[price]"="."$summ (gotov) - $summs (sobr)"; Оч. надо!!!
Курсач горит? приводите оригинальное задание а не то что вы понаписали. ничерта не понятно что вам требуется.
Что надо? Посчитать сумму потомков и записать родителю. В зависимости от того как хранятся данные можно набросать несколько вариантов: 1) Если хранить данные в массиве типа: PHP: <?php $arr=array( array('title'=>'Рыба', 'price'=>46, 'parts'=> array( array ('title'=>'Кости', 'price'=>1, 'parts'=>array()), array ('title'=>'Чешуя', 'price'=>1, 'parts'=>array()), array ('title'=>'Мясо', 'price'=>40, 'parts'=>array()) ) ), array('title'=>'Птица', 'price'=>87, 'parts'=> array( array ('title'=>'Кости', 'price'=>1, 'parts'=>array()), array ('title'=>'Перья', 'price'=>1, 'parts'=>array()), array ('title'=>'Мясо', 'price'=>80, 'parts'=>array()) ) ) //и т.д. ) то можно создать рекурсивную функцию, которая будет подсчитывать сумму потомков. 2)Если хранить в линейном массиве типа: PHP: <?php $arr=array( 1=>array('title'=>'Рыба', 'price'=>46, 'pid'=>0), 2=>array('title'=>'Кости', 'price'=>1, 'pid'=>1), 3=>array('title'=>'Чешуя', 'price'=>1, 'pid'=>1), 4=>array('title'=>'Мясо', 'price'=>40, 'pid'=>1), 5=>array('title'=>'Птица', 'price'=>87, 'pid'=>0), 6=>array('title'=>'Кости', 'price'=>1, 'pid'=>5), 7=>array('title'=>'Перья', 'price'=>1, 'pid'=>5), 8=>array('title'=>'Мясо', 'price'=>80, 'pid'=>5) //и т.д. ) то при уровне вложенности не больше 2 можно тупо по pid находить родителя и суммировать в нужное поле. 3)Если хранить в упорядоченном линейном массиве типа: PHP: <?php $arr=array(array('id'=>1 'title'=>'Рыба', 'price'=>46, 'lvl'=>1), array('id'=>2 'title'=>'Кости', 'price'=>1, 'lvl'=>2), array('id'=>3 'title'=>'Чешуя', 'price'=>1, 'lvl'=>2), array('id'=>4 'title'=>'Мясо', 'price'=>40, 'lvl'=>2), array('id'=>5 'title'=>'Птица', 'price'=>87, 'lvl'=>1), array('id'=>6 'title'=>'Кости', 'price'=>1, 'lvl'=>2), array('id'=>7 'title'=>'Перья', 'price'=>1, 'lvl'=>2), array('id'=>8 'title'=>'Мясо', 'price'=>80, 'lvl'=>2) //и т.д. ) //(это Ваш вариант, насколько я понял) то надо шаманить с PHP: <?php $curId=-1; foreach($arr as $part){ if ($part['lvl']==1){ if($curId>-1){ $arr[$curId]['sum']=$curSum; } $curSum=0; $curId=$part['id'] } else{ $curSum+=$part['price']; } } $arr[$curId]['sum']=$curSum; 4) Ну и на закуску: если данные в базе хранить по принципу Redundant Adjacency List, то необходимая информация выбирается в один запрос.
Volt(220) Массив то одномерный, но уровней $row[lvl]может быть до 4-х. Как можно н.р. сумму($summ2) 3-го уровня записать во 2-й(строк 2 -го уровня несколько, но только в одном есть 3-йуровень), а 2-й в 1-й. БД сервировка стола: Повторюсь, как подсчитать LVL нижнего уровня и занести их в верхний чтобы порядок выхода данных не испортился. Т.е. при выводе (id == 17) должны присутствовать уже все 3 суммы. Еще есть примеры, оч. горит?
чего-то данных у вас не хватает... а где написано, что дрожжи относятся к пирогу, а не к рому или подносу?
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
0)Я бы все-таки изменил способ хранения данных хотя бы на Adjacency List. Тогда, думаю, найдется много готовых решений в гугле. 1) Как было сказано выше: Как определяется к какому уровню относиться подуровень? 2) Если уровней много и сумма первого уровня должна быть равна сумма второго+ сумма третьего + и т.д., то можно усовершенствовать алгоритм в 3) пункте: а) Развернуть проход по массиву - идти с конца в начало. б) считать сумму пока уровень не изменился. в) когда уровень изменился записать сумму в стек г) если уровень стал больше (из 2 в 3), то считаем новую сумму д) если уровень стал меньше, то вытаскиваем значение из стека, записываем его в элемент, делаем эту сумму текущей г) если уровень =1, то обнулить текущую сумму.
0) К другому способу не хочется переходить, попробовать обработать в текущем виде. 1) ни как не относится к подуровням, просто последовательность строк в массиве. вот и их и надо разграничить вручную по lvl. 2)-й пунк согласен. а) Как пройти массив с конца? Может все результаты сохранять в новый массив, и потом в конце его просто вывести? в) как записывать данные в стек и как потом из него извлекать туже сумму? И в стек записывать всю строку массива чтобы потом уже с обновленными данными ее выводить. по остальным пунктам вроде как понятно. Может конечно совсем дурацкие вопросы... но пока полный чайник. Так что сильно просьба не пинать. Часть кода в пример, логика понятна, но как это реализовать?
Можно, конечно, шаманить со всякими _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 Не совсем понял идею. Стек нам нужен чтобы не присумировать случайно сумму второго уровня третьему.
igordata Сумму последующих [lvl] => 2 пишем в [assem] [lvl] => 1 Код (Text): [11] => Array ( [0] => 1 [lvl] => 1 [1] => 1766 [id] => 1766 [2] => A [type] => A [3] => K [sub] => K [4] => 1 [part] => 1 [5] => 1 [version] => 1 [6] => cabinet on module [name] => cabinet on module [7] => 1 [qty] => 1 [8] => 0 [sumlev] => 0 [9] => 0 [assem] => 0 [10] => 0 [crline] => 3 ) [12] => Array ( [0] => 1 [lvl] => 1 [1] => 1734 [id] => 1734 [2] => A [type] => A [3] => W [sub] => W [4] => 5 [part] => 5 [5] => 1 [version] => 1 [6] => cable pour DT [name] => cable pour DT [7] => 1 [qty] => 1 [8] => 0 [sumlev] => 0.074 [9] => 0 [assem] => 0 [10] => 0 [crline] => 3 ) [13] => Array ( [0] => 2 [lvl] => 2 [1] => 1744 [id] => 1744 [2] => E [type] => E [3] => W [sub] => W [4] => 2 [part] => 2 [5] => 1 [version] => 1 [6] => cable UNI300 CY [name] => cable UNIT300 CY [7] => 1 [qty] => 1 [8] => 0 [sumlev] => 100 [9] => 0 [assem] => 0 [10] => 0 [crline] => 1 ) [14] => Array ( [0] => 2 [lvl] => 2 [1] => 1747 [id] => 1747 [2] => E [type] => E [3] => X [sub] => X [4] => 6 [part] => 6 [5] => 1 [version] => 1 [6] => pise M12 fem [name] => pise M12 fem [7] => 1 [qty] => 1 [8] => 0 [sumlev] => 0 [9] => 0 [assem] => 0 [10] => 0 [crline] => 3 ) [15] => Array ( [0] => 1 [lvl] => 1 [1] => 1735 [id] => 1735 [2] => E [type] => E [3] => W [sub] => W [4] => 6 [part] => 6 [5] => 1 [version] => 1 [6] => cable pour [name] => cable pour [7] => 2 [qty] => 2 [8] => 0 [sumlev] => 4.01 [9] => 0 [assem] => 0 [10] => 0 [crline] => 3 ) [16] => Array ( [0] => 2 [lvl] => 2 [1] => 1746 [id] => 1746 [2] => E [type] => E [3] => W [sub] => W [4] => 3 [part] => 3 [5] => 1 [version] => 1 [6] => Vollt [name] => Vollt [7] => 1 [qty] => 1 [8] => 0 [sumlev] => 0 [9] => 0 [assem] => 0 [10] => 0 [crline] => 3 ) [17] => Array ( [0] => 2 [lvl] => 2 [1] => 1742 [id] => 1742 [2] => A [type] => A [3] => X [sub] => X [4] => 4 [part] => 4 [5] => 1 [version] => 1 [6] => embase conn [name] => embase conn [7] => 2 [qty] => 2 [8] => 0 [sumlev] => 0 [9] => 0 [assem] => 0 [10] => 0 [crline] => 3 ) [18] => Array ( [0] => 2 [lvl] => 2 [1] => 1743 [id] => 1743 [2] => A [type] => A [3] => X [sub] => X [4] => 5 [part] => 5 [5] => 1 [version] => 1 [6] => pin sertir [name] => pin sertir [7] => 8 [qty] => 8 [8] => 0 [sumlev] => 0 [9] => 0 [assem] => 0 [10] => 0 [crline] => 3 ) [19] => Array ( [0] => 1 [lvl] => 1 [1] => 1745 [id] => 1745 [2] => E [type] => E [3] => W [sub] => W [4] => 7 [part] => 7 [5] => 1 [version] => 1 [6] => cable pour [name] => cable pour [7] => 1 [qty] => 1 [8] => 0 [sumlev] => 6.58 [9] => 0 [assem] => 0 [10] => 0 [crline] => 3 )