За последние 24 часа нас посетили 49727 программистов и 1728 роботов. Сейчас ищут 605 программистов ...

3-хмерный массив

Тема в разделе "PHP для новичков", создана пользователем kilogram, 7 апр 2012.

  1. kilogram

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

    С нами с:
    19 мар 2012
    Сообщения:
    116
    Симпатии:
    0
    Попробовал вывести массив:
    Код (Text):
    1.  
    2. for ($i=0,$x=0; $x<16; $x++) {
    3.   for ($y=0; $y<16; $y++) {
    4.     $chars[$x][$y] = array($i, chr($i));
    5.     $i++;
    6.   }
    7. }
    8.  
    9.  
    10. for ($i = 0; $i < count($chars); $i++)
    11.    for ($j = 0; $j < count($chars[$i]); $j++)
    12.       for ($k = 0; $k < count($chars[$i][$j]); $k++)
    13.           echo $chars[$i][$j][$k].' ';
    Вроде вывел. Интересует вопрос. Почему во втором внутреннем форе нужно писать $chars[$i], а в третем форе $chars[$i][$j] ?
     
  2. html-программист

    html-программист Активный пользователь

    С нами с:
    10 фев 2012
    Сообщения:
    831
    Симпатии:
    4
    Адрес:
    Kiev
    Для того, чтобы функция count знала, что считать.

    Добавлено спустя 2 минуты 38 секунд 112 миллисекунд:
    А вообще, рекомендую делать так:

    Код (Text):
    1.  
    2. for ($i = 0, $c1=count($chars); $i <$c1; $i++)
    3.    for ($j = 0, $c2=count($chars[$i]); $j <$c2; $j++)
    4.       for ($k = 0, $c3=count($chars[$i][$j]); $k <$c3; $k++)
    5.           echo $chars[$i][$j][$k].' ';
    Первое выражение в цикле фор считается только один раз - в начале цикла. Второе - считается на каждой итерации.
     
  3. kilogram

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

    С нами с:
    19 мар 2012
    Сообщения:
    116
    Симпатии:
    0
    Почему там с i во втором форе, а в третем форе с i + j?
     
  4. html-программист

    html-программист Активный пользователь

    С нами с:
    10 фев 2012
    Сообщения:
    831
    Симпатии:
    4
    Адрес:
    Kiev
    Потому что функция count по умолчанию не считает количество элементов во вложенных массивах. Фактически, твой массив $chars - это одномерный массив с индексами от 0 до $i-1, элементами которого являются так-же массивы. Чтобы посчитать количество элементов в этих массивах, надо в функцию count их передать count($chars[$i]).

    Добавлено спустя 9 минут 24 секунды 15 миллисекунд:
    Вот твой массив $chars:

    [​IMG]

    Когда ты вызываешь функцию count($chars) - она считает количество элементов массива (как видно на схемке, count($chars)=5). Когда вызываешь функцию, скажем так count($chars[2]) - она считает количество элементов во "внутреннем массиве" (count($chars[2])=4). Ну и соответственно, если ты вызовешь функцию так count($chars[2][2]) - она посчитает количество уже на последнем уровне.
    Ну а для того, чтобы посчитать ВСЕ элементы массива - можно написать так count($chars, 1) или так count($chars, COUNT_RECURSIVE)
     
  5. kilogram

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

    С нами с:
    19 мар 2012
    Сообщения:
    116
    Симпатии:
    0
    Это вроде ясно, не понятно почему вот эти скобки дописывать нужно во втором и третем форе. Понятно, чтоб пробраться во внутренний массив, не могу понять почему эти скобки добавлять с [$i] и в третем цикле [$i][$j]
     
  6. html-программист

    html-программист Активный пользователь

    С нами с:
    10 фев 2012
    Сообщения:
    831
    Симпатии:
    4
    Адрес:
    Kiev
    Какие скобки?
     
  7. kilogram

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

    С нами с:
    19 мар 2012
    Сообщения:
    116
    Симпатии:
    0
    Я про квадратные скобки
    2 фор - $chars[$i]
    3 фор - chars[$i][$j]
     
  8. html-программист

    html-программист Активный пользователь

    С нами с:
    10 фев 2012
    Сообщения:
    831
    Симпатии:
    4
    Адрес:
    Kiev
    $a - обычная переменная (sting, array, bool... все что угодно)
    $a2[] - одномерный массив
    $a3[][] - двумерный массив
    $a4[][][] - трехмерный массив
    Квадратные скобки используются в php чтобы указать индекс массива. Если используется больше одной пары квадратных скобок - массив многомерный.
    В c++ так-же используется больше одной пары квадратных скобок для указания индексов многомерных массивов - a[j]
    В Pascal/Delphi все индексы многомерных массивов указываются в одной паре квадратных скобок - a[i, j]
    Ну а в Бейсике используются круглые скобки, и опять-же одной пары скобок вполне хватает - A(i ,j)
    Ну а в диалектах ECMAScript, например ActionScript (Не знаю, как там в JS, но в AS - точно), вообще невозможно указать многомерный массив в явном виде. Хотя, если запихнешь один массив в другой - в ECMAScript обращение к элементам массивов тоже идет со множеством квадратных скобок.
    Как указывать многомерные массивы в ассемблере - не знаю. Не сталкивался ни с ассемблером, ни тем более с многомерными массивами в ассемблере. Есть подозрение, что в нем вообще нет массивов.
     
  9. kilogram

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

    С нами с:
    19 мар 2012
    Сообщения:
    116
    Симпатии:
    0
    Для того что бы получить значение этого масива пишется его ключ?
    Другими словами пишется переменная счетчика в квадратных скобках и чем больше многомерный массив тем больше квадратных скобок с разн. назв. переменных счетчика?
     
  10. html-программист

    html-программист Активный пользователь

    С нами с:
    10 фев 2012
    Сообщения:
    831
    Симпатии:
    4
    Адрес:
    Kiev
    Нет. "Больше" не влияет на количество скобок. Влияет размерность массива. Скобки указывают размерность. У одномерных массивов - [x], у двумерных - [x][y], у трехмерных - [x][y][z].
    Чтобы лучше представить себе, что такое трехмерный массив, можешь представить такую-себе систему координат, например:

    [​IMG]

    $A[$B][$C][$D]. Где $B, $C и $D - координаты на осях x, y и z соответственно (индексы массива). А само значение массива - это скажем цвет этой точки A. На картинке $A[$B][$C][$D]="black", а соответственно все остальные точки, например $A[$B-1][$C+5][$D]="white" в php, помему, нельзя в качестве индексов массива использовать выражения и другие массивы

    Ну а двумерный массив можно представить в виде обыкновенной таблицы, где $a[$x][$y], $x - номер столбика, $y - номер строки, а $a[$x][$y] - содержит значение из столбика $x и строки $y. Прям как в Екселе.
     
  11. kilogram

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

    С нами с:
    19 мар 2012
    Сообщения:
    116
    Симпатии:
    0
    Пишутся квадратные скобки во втором, третем форе и дальше - это означает что мы получаем доступ к вложенному массиву через его счетчик?
     
  12. html-программист

    html-программист Активный пользователь

    С нами с:
    10 фев 2012
    Сообщения:
    831
    Симпатии:
    4
    Адрес:
    Kiev
    Смотри.
    Вот твой $string
    [​IMG]

    когда мы вызываем функцию count($string), эта функция считает количество столбиков. Чтобы посчитать количество строчек в нужном нам столбике, надо обратиться к этому столбику, например в столбике D count($string[D])=11 строк. Ну а чтобы посчитать количество элементов в нужном столбике и нужной строке, например D3 - count($string[D][3]) - получаем 6 элементов.
     
  13. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Ну потому, что вы разглаживаете и каждый раз разложенное опять разлаживаете.
    Бывает, что можно пойти и другим путем.

    Код (PHP):
    1. $a='1,2,3,4;5,6,7,8||1,2,3,4;5,6,7,8';
    2. $e=explode('||',$a);
    3. for($i=0;$i<sizeof($e);$i++)
    4. {
    5.     $s=explode(';',$e[$i]);
    6.     for($l=0;$l<sizeof($s);$l++)
    7.     {
    8.         $d=explode(',',$s[$l]);
    9.         echo'<br />';
    10.         for($t=0;$t<sizeof($d);$t++)
    11.         {
    12.             echo$d[$t].'<br />';
    13.         }
    14.     }
    15. }
    16.  
    Правдо это немного другое.
    И вообще как пример.
    Не более!
     
  14. kilogram

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

    С нами с:
    19 мар 2012
    Сообщения:
    116
    Симпатии:
    0
    Доступ к внутреннему массиву в циклве фор, мы полчаем через индекс массива?
     
  15. sobachnik

    sobachnik Старожил

    С нами с:
    20 апр 2007
    Сообщения:
    3.380
    Симпатии:
    13
    Адрес:
    Дмитров, МО
    Доступ к любому элементу массива, в том числе и если он является другим (вложенным) массивом - может быть осуществлён через индекс массива. Также есть такая конструкция, как foreach и функции типа current, next, each с помощью которых можно осуществлять навигацию по массиву не зная его индексов.
     
  16. kilogram

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

    С нами с:
    19 мар 2012
    Сообщения:
    116
    Симпатии:
    0
    Вот это я хотел и уточнить, спс. А название переменных счетчиков во вложенных форах, [$i] или 3-ий фор [$i][$j] - это один из идексов доуступа к этим внутренним массивам з каждой итерацией?
     
  17. igordata

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

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    слух. ты уже вкури тему.

    $a - массив.
    $a[x] - обращение к члену x массива $a
    $a[x][y] - обращение к члену y массива x массива $a

    по русски:
    берем массив, просим его член. Вот так прямо. А в его члене есть еще один член. Если есть. Бывает, что в члене нет члена, то тогда это не член Чужого, а обычный член. И будет ворнинг. Но если в члене есть другие члены, то радость - будет все зашибись.

    а что ты там делаешь с титькерациями или без титькераций, то это уже твое дело. Ты в любой момент можешь обратиться к любому массиву и даже не массиву, но все равно обратиться как к массиву, и к существующему члену или даже к несуществующему члену, и что-нибудь из этого выйдет.

    И имей в виду, используя цикл for ты еще можешь кучу раз наобращаться к тем членам, которых нет. Пхп не перебивает заново индексы, если ты похерил один из членов в середине. Если один из членов вырезали, то на это месте будет дырка. И ты вроде как хотел обратиться к члену, а обратился к дырке. И будет ворнинг. Посему юзай foreach.