За последние 24 часа нас посетили 15240 программистов и 1684 робота. Сейчас ищут 899 программистов ...

разбить массив на вложенные массивы

Тема в разделе "PHP для новичков", создана пользователем Sabirus, 31 окт 2014.

  1. Sabirus

    Sabirus Новичок

    С нами с:
    31 окт 2014
    Сообщения:
    13
    Симпатии:
    0
    Вот у меня массив получен в результате pg_fetch_assoc. как мне разбить его на вложенные массивы. помогите пожалуйста.
     
  2. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    что есть на входе, что должно быть на выходе, в примере.
     
  3. Sabirus

    Sabirus Новичок

    С нами с:
    31 окт 2014
    Сообщения:
    13
    Симпатии:
    0
    В базе хранятся две связанные таблицы. То есть, в первой таблице родительские записи, а во второй дочерные элементы. Надо извлекать данных в виде xml. С помощью pg_fetch_assoc получила массив, чтобы избавиться повторяющихся элементов. теперь полученный массив надо разбить на вложенный массив( дочерние элементы). Как мне это сделать?
     
  4. smitt

    smitt Старожил

    С нами с:
    3 янв 2012
    Сообщения:
    3.166
    Симпатии:
    65
    Покажи какой массив получила.
     
  5. Sabirus

    Sabirus Новичок

    С нами с:
    31 окт 2014
    Сообщения:
    13
    Симпатии:
    0
    Код программы:

    <?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?
     
  6. metadon

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

    С нами с:
    6 фев 2006
    Сообщения:
    779
    Симпатии:
    0
    Думаю тут можно простым циклом обойтись
     
  7. Sabirus

    Sabirus Новичок

    С нами с:
    31 окт 2014
    Сообщения:
    13
    Симпатии:
    0
    к примеру подскажите пожалуйста!
     
  8. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    как заявлено выше надо просто воспользоваться циклом и внутри цикла запустить еще один цикл, примерно как то так.

    Добавлено спустя 7 минут 48 секунд:
    У тебя есть 2 таблицы, они связаны, ты делаешь два запроса, потом крутишь и в результате если брать одну секцию из XML то это должно быть что то типа:
    Код (Text):
    1. <record 1>
    2.     <kod>5B</kod>
    3.     <name>ывсми</name>
    4.     <gkz> </gkz>
    5.     <relation>
    6.         <kods>5B010</kods>
    7.         <name>ыпывыпып</name>
    8.         <type>d</type>
    9.     </relation>
    10.  
    11.     <relation>
    12.         <kods>5B090</kods>
    13.         <name>sfsfsdf</name>
    14.         <type>d</type>
    15.     </relation>
    16. </record>
    вопрос, что из этих данных XML будет в первом массиве, что во втором

    Допустим в первом массиве будет:
    Код (Text):
    1. <kod>5B</kod>
    2. <name>ывсми</name>
    3. <gkz> </gkz>
    а во втором (то что попадает в теги relation):
    Код (Text):
    1. <kods>5B010</kods>
    2. <name>ыпывыпып</name>
    3. <type>d</type>
    я просто не совсем понимаю почему 2 relation, откуда второе
     
  9. metadon

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

    С нами с:
    6 фев 2006
    Сообщения:
    779
    Симпатии:
    0
    Можно прочитать хотя бы одну книгу по php mysql чтобы таких вопросов не возникало.

     
  10. Sabirus

    Sabirus Новичок

    С нами с:
    31 окт 2014
    Сообщения:
    13
    Симпатии:
    0
    я просто не совсем понимаю почему 2 relation, откуда второе?

    5B- это самый верхний терм, оттуда 5B010..5B090 внутренние и они делятся на подтермы
     
  11. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    т.е. если брать одну секцию (один элемент массива) то он будет выглядеть так:
    Код (PHP):
    1. 'kod' => '5В',
    2. 'name' => 'Специальности бакалавриата',
    3. 'gkz' => '',
    4. 'sub' => array(
    5.     array( 'kods' => '5В010', 'name' => 'Специальности бакалавриата. Образование', 'type' => 'd' ),
    6.     array( 'kods' => '5В100', 'name' => 'Специальности бакалавриата. Военное дело и безопасность', 'type' => 'd' )
    7. )
    8. ); 
    а после обработки он должен будет выглядеть так:
    Код (Text):
    1.     <record 1>
    2.        <kod>5B</kod>
    3.        <name>Специальности бакалавриата</name>
    4.        <gkz> </gkz>
    5.        <relation>
    6.           <kods>5В010</kods>
    7.           <name>'Специальности бакалавриата. Образование</name>
    8.           <type>d</type>
    9.        </relation>
    10.  
    11.        <relation>
    12.           <kods>5В100</kods>
    13.           <name>'Специальности бакалавриата. Военное дело и безопасность</name>
    14.           <type>d</type>
    15.        </relation>
    16.     </record>
    все верно?
     
  12. Sabirus

    Sabirus Новичок

    С нами с:
    31 окт 2014
    Сообщения:
    13
    Симпатии:
    0
    Да, верно.
     
  13. metadon

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

    С нами с:
    6 фев 2006
    Сообщения:
    779
    Симпатии:
    0
    можно использовать foreach чтобы в цикле пройтись по массиву и сформировать xml в нужном формате
     
  14. Sabirus

    Sabirus Новичок

    С нами с:
    31 окт 2014
    Сообщения:
    13
    Симпатии:
    0
    Вот именно, что цикл у меня неправильный. На выходе все внутренние элементы входят под первый элемент.
     
  15. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    добавим для масштабности еще одну секцию (раздел / запись)
    Код (PHP):
    1. $section_1 = array(
    2. 'kod' => '5В',
    3. 'name' => 'Специальности бакалавриата',
    4. 'gkz' => '',
    5. 'sub' => array(
    6.     array( 'kods' => '5В010', 'name' => 'Специальности бакалавриата. Образование', 'type' => 'd' ),
    7.     array( 'kods' => '5В100', 'name' => 'Специальности бакалавриата. Военное дело и безопасность', 'type' => 'd' )
    8. )
    9. );
    10.  
    11. $section_2 = array(
    12. 'kod' => '5C',
    13. 'name' => 'Дошкольное обучение и воспитание',
    14. 'gkz' => '',
    15. 'sub' => array(
    16.     array( 'kods' => '5C001', 'name' => 'Дошкольное обучение', 'type' => 'z' ),
    17.     array( 'kods' => '5C002', 'name' => 'Дошкольное воспитание', 'type' => 'z' )
    18. )
    19. );
    засунем в один массив:
    Код (PHP):
    1. $data = array($section_1, $section_2);
    и прокрутим через цикл:
    Код (PHP):
    1. $str ='';
    2.  
    3. $str .= "<records>\n";
    4. for($i = 0; $i < sizeof($data); $i++)
    5. {
    6.     $num = $i+1;
    7.     $str .= "\t<record {$num}>\n";
    8.     $str .= "\t\t<kod>{$data[$i]['kod']}</kod>\n";
    9.     $str .= "\t\t<name>{$data[$i]['name']}</name>\n";
    10.     $str .= "\t\t<gkz>{$data[$i]['gkz']}</gkz>\n";
    11.     
    12.     foreach($data[$i]['sub'] as $sub)
    13.     {
    14.         $str .= "\t\t<relation>\n";
    15.         
    16.         $str .= "\t\t\t<kods>{$sub['kods']}</kods>\n";
    17.         $str .= "\t\t\t<name>{$sub['name']}</name>\n";
    18.         $str .= "\t\t\t<type>{$sub['type']}</type>\n";
    19.         
    20.         $str .= "\t\t</relation>\n";
    21.     }
    22.     
    23.     $str .= "\t</record>\n";
    24. }
    25. $str .= "</records>\n";
     
  16. Sabirus

    Sabirus Новичок

    С нами с:
    31 окт 2014
    Сообщения:
    13
    Симпатии:
    0
    Спасибо, вот теперь вопрос, как мне сделать дальше я же из базы беру все данные?
     
  17. metadon

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

    С нами с:
    6 фев 2006
    Сообщения:
    779
    Симпатии:
    0
    Можно прочитать хотя бы одну книгу по php mysql чтобы таких вопросов не возникало.
     
  18. Sabirus

    Sabirus Новичок

    С нами с:
    31 окт 2014
    Сообщения:
    13
    Симпатии:
    0
    День добрый! Помогите еще разобраться в ошибках,