Вот у меня массив получен в результате pg_fetch_assoc. как мне разбить его на вложенные массивы. помогите пожалуйста.
В базе хранятся две связанные таблицы. То есть, в первой таблице родительские записи, а во второй дочерные элементы. Надо извлекать данных в виде xml. С помощью pg_fetch_assoc получила массив, чтобы избавиться повторяющихся элементов. теперь полученный массив надо разбить на вложенный массив( дочерние элементы). Как мне это сделать?
Код программы: <?php $db = pg_connect("host=localhost port=5432 dbname=baza user=postgres password=admin") or die('Could not connect: ' . pg_last_error()); $query = 'SELECT kod,name, gkz FROM bak, disrel WHERE bak.id=disrel.id ORDER BY bak.id '; //SELECT disrel.kods, bak.name, disrel.type FROM disrel JOIN bak ON bak.kod=disrel.kods ORDER BY disrel.ide '; $result = pg_query($query) or die('Ошибка запроса: ' . pg_last_error()); $query1 = "SELECT disrel.kods, bak.name, disrel.type FROM disrel JOIN bak ON bak.kod=disrel.kods ORDER BY disrel.ide "; $result1 = pg_query($query1) or die ("Error in query1: $query1. " . pg_last_error()); $test1 = array(); $test2 = array(); header("Content-type: text/php; charset= UTF-8"); while ($row = pg_fetch_assoc($result)){ $test1[] = $row; $new_result = array_unique($test1); }; while ($row = pg_fetch_assoc($result1)){ $test2[] = $row; } foreach($new_result as $one_elem){ $one_elem['sub'] = array(); foreach($test2 as $second_elem){ if($second_elem['id'] == $one_elem['id']) { $one_elem['sub'][] = $second_elem; } }; } var_dump($new_result); var_dump($one_elem); ?> Получила: array(1) { [0]=> array(3) { ["kod"]=> string(3) "5В" ["name"]=> string(51) "Специальности бакалавриата" ["gkz"]=> NULL } } array(4) { ["kod"]=> string(3) "5В" ["name"]=> string(51) "Специальности бакалавриата" ["gkz"]=> NULL ["sub"]=> array(620) { [0]=> array(3) { ["kods"]=> string(6) "5В010" ["name"]=> string(75) "Специальности бакалавриата. Образование" ["type"]=> string(1) "d" } ..... [9]=> array(3) { ["kods"]=> string(6) "5В100" ["name"]=> string(106) "Специальности бакалавриата. Военное дело и безопасность " ["type"]=> string(1) "d" } [10]=> array(3) { ["kods"]=> string(3) "5В" ["name"]=> string(51) "Специальности бакалавриата" ["type"]=> string(1) "u" } [11]=> array(3) { ["kods"]=> string(9) "5В010100" ["name"]=> string(62) "Дошкольное обучение и воспитание" ["type"]=> string(1) "d" } Добавлено спустя 7 минут 16 секунд: результат должен быть: <records> <record 1> <kod>5B</kod> <name>ывсми</name> <gkz> </gkz> <relation> <kods>5B010</kods> <name>ыпывыпып</name> <type>d</type> </relation> ... <relation> <kods>5B090</kods> <name>sfsfsdf</name> <type>d</type> </relation> </record> <record 2> <kod>5B010</kod> <name>dfghhj</name> <gkz> </gkz> <relation> <kods>5B010100</kods> <name>ыпывыпып</name> <type>d</type> </relation> ..... <relation> <kods>5B012300</kods> <name>sfsfsdf</name> <type>d</type> </relation> ...... </record> <record 3> <kod>5B020</kod> <name>dfghhj</name> <gkz> </gkz> <relation> <kods>5B020100</kods> <name>ыпывыпып</name> <type>d</type> </relation> .... <relation> <kods>5B022200</kods> <name>sfsfsdf</name> <type>d</type> </relation> ...... </record> </records> Добавлено спустя 4 минуты 6 секунд: Может есть какие то другие способы? как по объектной модели DOMDocument?
как заявлено выше надо просто воспользоваться циклом и внутри цикла запустить еще один цикл, примерно как то так. Добавлено спустя 7 минут 48 секунд: У тебя есть 2 таблицы, они связаны, ты делаешь два запроса, потом крутишь и в результате если брать одну секцию из XML то это должно быть что то типа: Код (Text): <record 1> <kod>5B</kod> <name>ывсми</name> <gkz> </gkz> <relation> <kods>5B010</kods> <name>ыпывыпып</name> <type>d</type> </relation> <relation> <kods>5B090</kods> <name>sfsfsdf</name> <type>d</type> </relation> </record> вопрос, что из этих данных XML будет в первом массиве, что во втором Допустим в первом массиве будет: Код (Text): <kod>5B</kod> <name>ывсми</name> <gkz> </gkz> а во втором (то что попадает в теги relation): Код (Text): <kods>5B010</kods> <name>ыпывыпып</name> <type>d</type> я просто не совсем понимаю почему 2 relation, откуда второе
я просто не совсем понимаю почему 2 relation, откуда второе? 5B- это самый верхний терм, оттуда 5B010..5B090 внутренние и они делятся на подтермы
т.е. если брать одну секцию (один элемент массива) то он будет выглядеть так: Код (PHP): array( 'kod' => '5В', 'name' => 'Специальности бакалавриата', 'gkz' => '', 'sub' => array( array( 'kods' => '5В010', 'name' => 'Специальности бакалавриата. Образование', 'type' => 'd' ), array( 'kods' => '5В100', 'name' => 'Специальности бакалавриата. Военное дело и безопасность', 'type' => 'd' ) ) ); а после обработки он должен будет выглядеть так: Код (Text): <record 1> <kod>5B</kod> <name>Специальности бакалавриата</name> <gkz> </gkz> <relation> <kods>5В010</kods> <name>'Специальности бакалавриата. Образование</name> <type>d</type> </relation> <relation> <kods>5В100</kods> <name>'Специальности бакалавриата. Военное дело и безопасность</name> <type>d</type> </relation> </record> все верно?
Вот именно, что цикл у меня неправильный. На выходе все внутренние элементы входят под первый элемент.
добавим для масштабности еще одну секцию (раздел / запись) Код (PHP): $section_1 = array( 'kod' => '5В', 'name' => 'Специальности бакалавриата', 'gkz' => '', 'sub' => array( array( 'kods' => '5В010', 'name' => 'Специальности бакалавриата. Образование', 'type' => 'd' ), array( 'kods' => '5В100', 'name' => 'Специальности бакалавриата. Военное дело и безопасность', 'type' => 'd' ) ) ); $section_2 = array( 'kod' => '5C', 'name' => 'Дошкольное обучение и воспитание', 'gkz' => '', 'sub' => array( array( 'kods' => '5C001', 'name' => 'Дошкольное обучение', 'type' => 'z' ), array( 'kods' => '5C002', 'name' => 'Дошкольное воспитание', 'type' => 'z' ) ) ); засунем в один массив: Код (PHP): $data = array($section_1, $section_2); и прокрутим через цикл: Код (PHP): $str =''; $str .= "<records>\n"; for($i = 0; $i < sizeof($data); $i++) { $num = $i+1; $str .= "\t<record {$num}>\n"; $str .= "\t\t<kod>{$data[$i]['kod']}</kod>\n"; $str .= "\t\t<name>{$data[$i]['name']}</name>\n"; $str .= "\t\t<gkz>{$data[$i]['gkz']}</gkz>\n"; foreach($data[$i]['sub'] as $sub) { $str .= "\t\t<relation>\n"; $str .= "\t\t\t<kods>{$sub['kods']}</kods>\n"; $str .= "\t\t\t<name>{$sub['name']}</name>\n"; $str .= "\t\t\t<type>{$sub['type']}</type>\n"; $str .= "\t\t</relation>\n"; } $str .= "\t</record>\n"; } $str .= "</records>\n";