За последние 24 часа нас посетили 59929 программистов и 1774 робота. Сейчас ищут 819 программистов ...

Двумерные массивы

Тема в разделе "JavaScript и AJAX", создана пользователем Golovastik, 4 авг 2010.

  1. Golovastik

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

    С нами с:
    14 июл 2010
    Сообщения:
    193
    Симпатии:
    0
    Читаю книгу по явескрипту, дошёл до 2-мерных массивов.
    Там такой небольшой примерчик выводящий таблицу.



    [js]function display(table){
    document.write("<table border=1>");
    document.write('<th>Номер</th> <th>Наименование</th>');
    document.write('<th>Номер модели</th> <th>Количество</th>');


    for(x = 1; x<=3; x++){
    document.write('<tr><td>',x,'</td>');
    for(y = 0; y <=2; y++){
    document.write('<td>',table[x][y],'</td>');
    }
    document.write('</tr>');
    }
    document.write('</table>');
    }

    part1 = new Array('Тормозные колодки','39D48G',78);
    part2 = new Array('Тормозные башмаки','7D9UK3',45);
    part3 = new Array('Втулки','97WOST','14');[/js]

    brakeParts = new Array('',part1,part2,part3);

    display(brakeParts);




    Не ясны пару моментов.

    1)Если написать так:

    [js] brakeParts = new Array();[/js] //Это будет означать что мы создаём динамически объект brakeParts класса Array


    А вот это тчо тогда будет означать?

    Вот это [js]brakeParts = new Array('',part1,part2,part3); [/js]


    2)Объясните как работает это кусок:

    [js]for(x = 1; x<=3; x++){
    document.write('<tr><td>',x,'</td>');
    for(y = 0; y <=2; y++){
    document.write('<td>',table[x][y],'</td>'); //
    }
    document.write('</tr>');
    }
    document.write('</table>');
    }[/js]


    Заранее благодарю за скорый ответ.
     
  2. Padaboo

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

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    это и есть двумерный массив, массив элементы которого тоже массивы
    [js]<script>
    part1 = new Array('Тормозные колодки','39D48G',78);
    part2 = new Array('Тормозные башмаки','7D9UK3',45);
    brakeParts = new Array('',part1,part2);
    alert(brakeParts[1][2]);
    alert(brakeParts[2][2]);
    </script>[/js]
    запусти

    [js]<script language="JavaScript" type="text/javascript">
    document.write('<table border="1">');
    for(x = 1; x<=3; x++){
    document.write('<tr><td>'+x+'</td>');
    for(y = 0; y <=2; y++){
    document.write('<td>'+'table['+x+']['+y+']'+'</td>'); //
    }
    document.write('</tr>');
    }
    document.write('</table>');
    </script>[/js]
     
  3. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ну Вот это не более чем создание массива, первым членом которого будет пустая строка, а вторым, третьим и четвертым будут массивы, заданные ранее.

    а этот кусок работает так:
    сначала есть цикл, котрый проходит от одного до трех.
    в нем есть цикл, который проходит от нуля до двух на каждом круге предыдущего цикла. Т.е. первая итерация это x=1. Дальше крутится цикл с игреком: x=1, y=0, и еще разик x=1, y=1, потом опять x=1, y=2. Все просто. Соответственно, в следующий заход икс подростет, игрек опять пройдет от нуля до двух, потом опять икс подростет и игрек снова пройдет от нуля до двух....

    Что это значит для многомерного массива, а именно для table[x][y]:
    сначала из массива table берется член [1], потом по очереди из него,из этого члена как из массива, берутся члены с нуля по два - три штуки.
    Потом опять икс подрос, и из table берется [2], из него, как из массива (а он и есть массив видимо) берутся члены с 0 по 2.



    А в чем вопрос? =)

    Двумерный массив - это табличка.
     
  4. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Padaboo
    метод кнута и пряника
    кнута читал, пряника - не знаю...
     
  5. Padaboo

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

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    igordata
    значит ты просто в синяках xD
     
  6. Golovastik

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

    С нами с:
    14 июл 2010
    Сообщения:
    193
    Симпатии:
    0
    HTML:
    1. part1 = new Array('Тормозные колодки','39D48G',78);
    Это создание объекта парт1 и передача конструктору Аррей значений этого объекта?

    Скажите, каким образом, откуда куда летят элементы массива, от этого?
    Код (Text):
    1.  
    2.  
    3. part1 = new Array('Тормозные колодки','39D48G',78);
    4. part2 = new Array('Тормозные башмаки','7D9UK3',45);
    5. part3 = new Array('Втулки','97WOST','14');
    Каким образом они вставляются в таблицу? НЕ знаю как они вставляются.
     
  7. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    в приведенном вами коде эти данные в таблицу никак не попадут. а вот если заменить массив table на brakeParts - тогда да, попадут.

    Golovastik
    Это создание объекта парт1 и передача конструктору Аррей значений этого объекта?
    Выдыхай, бобер, выдыхай! =)

    Это создание массива парт1 с членами таким-то, сяким-то и эдаким.
    Как это делается, что там вобще делается и куда там что летит - отдельная пестня... Можете почитать про ассемблер надосуге. Расширите сознание. Паралельно можно почитать про процессоры, как они работают, сколько у них комманд, и т.п.

    Но ни к пхп ни к джаваскрипту это никаким боком вам не приклеится.
     
  8. Golovastik

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

    С нами с:
    14 июл 2010
    Сообщения:
    193
    Симпатии:
    0
    Вот это:
    Код (Text):
    1.  
    2. brakeParts = new Array('',part1,part2,part3);// создали многомерный массив массив
    Чтоб создать многомерный массив, нужно внутри конструктора Array который принадлежит классу Array, прописать сами одномерные массивы созданные раннее?
    Если это так, brakeParts - как знать сколько строк и столбцов я имею в этом массиве при таком объявлении.
    Код (Text):
    1.  
    2. brakeParts = new Array('',part1,part2,part3);// создали многомерный массив массив
     
  9. Padaboo

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

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    [js]<script>
    function print_r(arr, level) {
    var print_red_text = "";
    if(!level) level = 0;
    var level_padding = "";
    for(var j=0; j<level+1; j++) level_padding += " ";
    if(typeof(arr) == 'object') {
    for(var item in arr) {
    var value = arr[item];
    if(typeof(value) == 'object') {
    print_red_text += level_padding + "'" + item + "' :\n";
    print_red_text += print_r(value,level+1);
    }
    else
    print_red_text += level_padding + "'" + item + "' => \"" + value + "\"\n";
    }
    }

    else print_red_text = "===>"+arr+"<===("+typeof(arr)+")";
    return print_red_text;
    }

    part1 = new Array('Тормозные колодки','39D48G',78);
    part2 = new Array('Тормозные башмаки','7D9UK3',45);
    brakeParts = new Array('',part1,part2);
    alert(print_r(brakeParts));
    </script>[/js]
     
  10. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    сколько столбцов вы либо знаете заранее, либо не знаете заранее :D

    Другого не дано.

    Но есть возможность проверить член массива на то, является ли он тоже массивом is_array(brakeParts[0]) будет false, потому, что там пустая строка, а она не массив. на трех других членах будет тру, и дальше вы можете пройти по ним в цикле через count или sizeof. В случае если у вас не циферковые массивы, вы можете использовать конструкцию foreach, получив каждый член (да что ж такое-то?! одни члены кругом!) ввиде ключа и значения. Очень удобно, очень быстро.


    http://www.php.net/manual/en/function.count.php
    http://www.php.net/manual/en/function.sizeof.php
    http://www.php.net/manual/en/control-st ... oreach.php

    Одномерные, двумерные или многомерные массивы - все равно. В пхп нет строгой типизации. Каждый член массива может быть массивом. И так до бесконечности.
     
  11. Golovastik

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

    С нами с:
    14 июл 2010
    Сообщения:
    193
    Симпатии:
    0
    Есть такой вариант.
    Код (Text):
    1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    2. <html><head><title>Тренировка</title></head>
    3. <script type='text/javascript'>
    4. //-------------------------------------------------------------
    5. //----------------------2-мерный массив-------------------------
    6. //-------------------------------------------------------------
    7.  
    8.  
    9. function display(parametr_func){
    10.     document.write("<table border=1>");
    11.     document.write('<tr><td>Номер</td> <td>Наименование</td>');
    12.     document.write('<td>Номер модели</td> <td>Количество</td></tr>');
    13.  
    14.     for(var i = 0; i < 3; i++){
    15.         document.write('<tr><td>', i+1, '</td>');
    16.         for(var j = 0; j < 3; j++){
    17.             document.write('<td>', parametr_func[i][j], '</td>');
    18.         }
    19.         document.write('</tr>');
    20.     }
    21.     document.write("</table>");
    22. }
    23.  
    24. part1 = ['Машина','BMW','555'];
    25. part2 = ['Самолёт','TY-134','888'];
    26. part3 = ['Телефон','Nokia N73','22'];
    27.  
    28. display(new Array(part1,part2,part3));
    29.  
    30. </script>
    31. <body></body></html>
    Как в таком случаи будет называться созданный массив в этой строке?
    Код (Text):
    1. display(new Array(part1,part2,part3));
     
  12. Padaboo

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

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    Golovastik
    в этом месте никак, это анонимный вызов класса (в java это так по крайней мере называется xD)
    а в функции display - parametr_func
     
  13. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    никак. но внутри фунции display он будет называться parametr_func...

    что-то мне кажется, проблема у вас не в массивах.

    PHP:
    1. <?
    2. function a ($b) {}
    3.  
    4. $c = '';
    5.  
    6. a($c);
    как будет называться переменная $c в функции a?
     
  14. Golovastik

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

    С нами с:
    14 июл 2010
    Сообщения:
    193
    Симпатии:
    0
    Код (Text):
    1.  в функции display - parametr_func
    А за функцией дисплей как можно что-то изменить ,я имею ввиду значения например 1-ой строки, 2-го столбца?

    2)По поводу предыдущего кода, зачем там передавалась в этой строке кода:
    Код (Text):
    1. brakeParts = new Array('',part1,part2,part3);
    кавычки,зачем? Если написать вместо кавычек лбое число 200,1000, всё равно результат на экран не поменяется, зачем нужны тогда кавычки,зачем нужно передавать в качесве аргумента функции массив, и первым параметром которого кавычки или любое число которого не даёт толка и не куда не передаётся,но без этого не работает?
     
  15. Padaboo

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

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    [js]parametr_func[0][1]='blabla';[/js]
    обход массива начинается не с 0го элемента (там где у нас кавычки), а с первого , автор сделал это для того, что бы список начинался не с 0 а с 1 в таблице которая выводится
     
  16. Golovastik

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

    С нами с:
    14 июл 2010
    Сообщения:
    193
    Симпатии:
    0
    А почему если передать что угодно вмест окавычек,всё равно не куда эта передача не пойдёт?
     
  17. Padaboo

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

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    Golovastik
    я ж объяснил ... индексы массива заполняются от 0 т.е. 0 1 2 3 4 и т.п.
    т.е. brakeParts = new Array('',part1,part2,part3)
    0 это кавычки
    1 part1
    2 part2
    3 part3
    поскольку в самом первом примере, в цикле for(x = 1; x<=3; x++) икс начинается с единицы, значит первый элемент массива(элемент с индексом 0) пропускается, в нем у нас как раз кавычки (все равно что туда писать этот элемент цикл пропускает). Эта же переменная икс используется для нумерации строк (самая левая колонка), так вот нулевой элемент пропускается, для того чтобы нумерация шла не с нуля, а с единицы т.е.
    а не
    я не знаю как понятнее объяснить
     
  18. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Нужно было сначала создать массив, а потом уже пихать его в функцию.
     
  19. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    прихоть автора, не более. У меня это тоже вызвало удивление, ибо дергается потом не первый член массива [0] (массивы начинаются-то с нуля!), а второй - [1]

    Мало ли дураков, не думайте об этом.
     
  20. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Он спросил зачем это было сделано. =)


    Ну я могу допустим предположить такую ситуацию, когда в первом члене массива будет его название. А во втором допустим описание. А третий, четвертый и пятый уже запчасти.
     
  21. Padaboo

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

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
  22. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    единственная причина - не прибавлять единичку?
     
  23. Padaboo

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

    С нами с:
    26 окт 2009
    Сообщения:
    5.242
    Симпатии:
    1
    igordata
    мы же говорим о том зачем автор это сделал, а не о других способах сделать тоже самое
     
  24. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    я просто привык что "авторы" делают очередное "это" сплош и рядом, и уже давно не анализрую зачем они это делают =) поэтому в голову даже не пришло, что за этим, пока ты не показал картинку - я не понимал мысль. :D