PDA

Просмотр полной версии : как измерить длинну многомерного массива в 7?


gun 242
10.11.2005, 17:23
arr = new Array();
arr[[0, 1]] = 1;
arr[[0, 2]] = 2;
arr[[1, 1]] = 3;
arr[[1, 2]] = 4;
trace(arr.length);

в 6 версии этот код работал.
в 7 trace выдаёт 0.
подскажите, как в 7 измерить длинну многомерного массива ?

andr64
10.11.2005, 17:52
вот это извращение :eek:

... эта одномерный массив с ключами |двумерными массивами| =))))

iNils
10.11.2005, 17:56
это точно...
arr = new Array([],[]);
arr[0][0] = 1;
arr[0][1] = 2;
arr[1][0] = 3;
arr[1][1] = 4;
trace(arr.length);

или так
arr = new Array([1,2],[3,4]);
trace(arr.length);

Mokus
10.11.2005, 18:05
вот это извращение :eek:

... эта одномерный массив с ключами |двумерными массивами| =))))
Ето асоциативный масив с ключами одномерными масивами.

gun 242
10.11.2005, 18:33
а если их больше?

arr = new Array([],[]);
arr[0][0] = 1;
arr[0][1] = 2;
arr[1][0] = 3;
arr[1][1] = 4;
arr[2][0] = 3;
arr[2][1] = 4;
trace(arr.length);

gun 242
10.11.2005, 18:36
количество строк динамичное.
нужно узнать сколько их.

gun 242
10.11.2005, 18:42
вот это извращение :eek:

... эта одномерный массив с ключами |двумерными массивами| =))))
чем тебе такой синтаксис непонравился?

andr64
10.11.2005, 18:59
Ето асоциативный масив с ключами одномерными масивами.

ага, я это и хотел сказать )

andr64
10.11.2005, 19:04
чем тебе такой синтаксис непонравился?

хотя бы тем что .length не считает элемент с ключем |миссив| за элемент.... "а он есть"(с)...

arr = new Array();
arr[[0, 1]] = 1;
arr[[0, 2]] = 2;
arr[[1, 1]] = 3;
arr[[1, 2]] = 4;
trace('length = '+arr.length);
//
var len = 0;
for (var g in arr) {
len++;
}
trace('length = '+len);

gun 242
10.11.2005, 19:09
почему же 6 версии arr.length считал правельно?

gun 242
10.11.2005, 19:13
попробуй мой код в 6 запусти

iNils
10.11.2005, 19:21
толку то от этого?
вот пример (для 6-ки)
arr = new Array ();
arr[[0, 1]] = 1;
arr[[0, 2]] = 2;
arr[[1, 1]] = 3;
arr[[1, 2]] = 4;
trace (arr.length);
for (i = 0; i < arr.length; i++) {
trace (arr[i]);
}

gun 242
10.11.2005, 19:43
попробуй мой

arr = new Array();
arr[[0, 1]] = 1;
arr[[0, 2]] = 2;
arr[[1, 1]] = 3;
arr[[1, 2]] = 4;
arr[[2, 1]] = 5;
arr[[2, 2]] = 6;
for (i=0; i<arr.length; i++) {
trace(arr[[i, 1]]+" "+arr[[i, 2]]);
}
trace(arr.length);

gun 242
10.11.2005, 19:49
в 6 arr.length=3
в 7 arr.length=0
почему?

andr64
10.11.2005, 19:54
arr = new Array();
arr[[0, 1]] = 1;
arr[[0, 2]] = 2;
arr[[1, 1]] = 3;
arr[[1, 2]] = 4;
arr[[2, 1]] = 5;
arr[[2, 2]] = 6;

вапще то и 6ка и 7ка врут, элементов то всего 6

gun 242
10.11.2005, 20:00
элементов 6, но шестёрка понимает что считать надо только строчки

andr64
10.11.2005, 20:06
6ка наверное скорее не понимала,
а просто считала уникальные значения первых элементов ключей(массивов),

а 7ка ваще плюнула на это дело Ж)

gun 242
10.11.2005, 20:30
какой синтаксис должен быть, на твой взгляд?

iNils
10.11.2005, 20:42
Тебе двухмерный массив нужен или что?

gun 242
10.11.2005, 20:55
это не принципиально, допустим 10.
высота динамическая

gun 242
10.11.2005, 20:59
массив в массив пихать неохото так как система уже сделана.
нужно будет переделывать.
но появилась необходимость перевести её на семёрку.

andr64
11.11.2005, 12:36
тебе можно сделать что то типа
...может тормозитьarr = new Array();
arr[[0, 1]] = 1;
arr[[0, 2]] = 2;
arr[[1, 1]] = 3;
arr[[1, 2]] = 4;
arr[[2, 1]] = 5;
arr[[2, 2]] = 6;
//
Array.prototype.len = function() {
var l = 0;
var a = [];
for (var g in this) {
//trace('key['+g+'] type['+typeof (g)+'] val['+this[g]+'] type['+typeof (this[g])+']');
if (typeof (this[g]) != 'function') {
if (typeof (g) == 'string') {
var c = g.split(',', 2)[0];
} else {
var c = g;
}
if (a[c] == undefined) {
l++;
a[c] = true;
}
}
}
return l;
};
//
trace(arr.len());
особенности массивов =)a = [1, 2, 3];
trace('len='+a.length+' a=['+a+']');
//
a[6] = 6;
trace('len='+a.length+' a=['+a+']');
//
delete a[6];
trace('len='+a.length+' a=['+a+']');

а вообще такая запись a[[0,1]]=1; приводит к тому что ключ [0,1] конвертируется в строку.aa = [];
aa[[0, 1]] = 1;
for (var g in aa) {
trace(g+' '+typeof (g));
}

iNils
11.11.2005, 13:13
а вообще такая запись a[[0,1]]=1; приводит к тому что ключ [0,1] конвертируется в строку.aa = [];
aa[[0, 1]] = 1;
for (var g in aa) {
trace(g+' '+typeof (g));
}

а такая? :)
aa = [];
aa[0] = 1;
aa[1] = 2;
for (var g in aa) {
trace(g+' '+typeof (g));
}

andr64
11.11.2005, 13:30
ага :)
кароче строки рулят :rolleyes:

gun 242
11.11.2005, 13:37
ага :)
кароче строки рулят :rolleyes:
а зачем таким способом лазить по массиву?
моим способом все данные прекрасно извлекаються без лишних усилий
arr = new Array();
arr[[0, 1]] = 1;
arr[[0, 2]] = 2;
arr[[1, 1]] = 3;
arr[[1, 2]] = 4;
arr[[2, 1]] = 5;
arr[[2, 2]] = 6;
for (i=0; i<arr.length; i++) {
trace(arr[[i, 1]]+" "+arr[[i, 2]]);
}

iNils
11.11.2005, 13:52
Если "без лишних усилий", то зачем топик создал?

Если работает в 6-ке, то это не значит, что механизм правильный. В чем ты убедился столкнувшись с проблемой в 7-ке.

gun 242
11.11.2005, 13:55
в общем пришлось сделать не так красиво, как хотелось бы
arr = new Array();
arr[[0, 1]] = 1;
arr[[0, 2]] = 2;
arr[[1, 1]] = 3;
arr[[1, 2]] = 4;
arr[[2, 1]] = 5;
arr[[2, 2]] = 6;
for (i=0; arr[[i, 1]]!=undefined; i++) {
trace(arr[[i, 1]]+" "+arr[[i, 2]]);
}

gun 242
11.11.2005, 14:00
напиши какой механизм на твой взгляд правельный

andr64
11.11.2005, 14:04
в общем пришлось сделать не так красиво, как хотелось бы
arr = new Array();
arr[[0, 1]] = 1;
arr[[0, 2]] = 2;
arr[[1, 1]] = 3;
arr[[1, 2]] = 4;
arr[[2, 1]] = 5;
arr[[2, 2]] = 6;
for (i=0; arr[[i, 1]]!=undefined; i++) {
trace(arr[[i, 1]]+" "+arr[[i, 2]]);
}

так не пойдет, 2 послений пропадут:
arr = new Array();
arr[[0, 1]] = 1;
arr[[0, 2]] = 2;
arr[[1, 1]] = 3;
arr[[1, 2]] = 4;
arr[[2, 1]] = 5;
arr[[2, 2]] = 6;
//
arr[[7, 1]] = 75;
arr[[7, 2]] = 76;
//
for (i=0; arr[[i, 1]] != undefined; i++) {
trace(arr[[i, 1]]+" "+arr[[i, 2]]);
}

gun 242
11.11.2005, 14:09
поэтму этот вариант и некрасивый.
но в моём случае он подходит т.к. весь массив заполнен.

gun 242
11.11.2005, 14:15
если вы считаете что так массивы создавать неправильно.
покажите как надо!
а то третья страница идёт, а я вменяемого кода от вас ещё не увидел

iNils
11.11.2005, 14:16
Правильно: делать двухмерные массивы.

gun 242
11.11.2005, 14:19
покажи как

iNils
11.11.2005, 14:45
Смотри пост №3 данного топика

gun 242
11.11.2005, 14:52
и что?
посмотри что твой код считает
arr = new Array([],[]);
arr[0][0] = 1;
arr[0][1] = 2;
arr[1][0] = 3;
arr[1][1] = 4;
arr[2][0] = 3;
arr[2][1] = 4;
arr[3][0] = 3;
arr[3][1] = 4;
trace(arr.length);

gun 242
11.11.2005, 14:55
2, а должно быть 4.
у тебя он ширину считает, а надо длину

andr64
11.11.2005, 15:03
arr = new Array([],[],[],[]);

gun 242
11.11.2005, 15:05
arr = new Array([],[],[],[]);
ты предлогаешь в ширину массив заполять?:)

iNils
11.11.2005, 15:07
ты предлогаешь в ширину массив заполять?:)
Не знаю что такое ширина массива, есть длина.

gun 242
11.11.2005, 15:29
у нас разговор слепой с глухом получаеться.
попробую объяснить подродней.
из базы в виде xml получаю таблицу(3 колонок, число строк переменая).
загоняю данные в массив.
arr = [];
arr[[0, 1]] = 1;
arr[[0, 2]] = "Иван";
arr[[0, 3]] = "Иванов";
arr[[1, 1]] = 2;
arr[[1, 2]] = "Вася";
arr[[1, 3]] = "Васильев";
arr[[2, 1]] = 3;
arr[[2, 2]] = "Петя";
arr[[2, 3]] = "Пертов";
arr[[3, 1]] = 4;
arr[[3, 2]] = "Коля";
arr[[3, 3]] = "Николаев";
// потом возникает необходимость пробежаться по нему в цикле.
// и тут проблема. сколько в нём строк.
for (i=0; i<arr.length; i++) {
trace(arr[[i, 1]]+" "+arr[[i, 2]]+" "+arr[[i, 3]]);
}

ясно?

iNils
11.11.2005, 15:40
Все давным давно все ясно. Это ты ни как не можешь понять.

Показываю на пальцах:

xmlA = new XML ("<a><b><c q='1'/><c q='Иван'/><c q='Иванов'/></b><b><c q='2'/><c q='Вася'/><c q='Васильев'/></b><b><c q='3'/><c q='Петя'/><c q='Пертов'/></b><b><c q='4'/><c q='Коля'/><c q='Николаев'/></b></a>");
xmlA.ignoreWhite = true;
arr = [];
for (var i = 0; i < xmlA.firstChild.childNodes.length; i++) {
arr[i] = [];
for (var j = 0; j < xmlA.firstChild.childNodes[i].childNodes.length; j++) {
arr[i][j] = xmlA.firstChild.childNodes[i].childNodes[j].attributes.q;
}
}
for (var i = 0; i < arr.length; i++) {
trace (arr[i][0] + " " + arr[i][1] + " " + arr[i][2]);
}

gun 242
11.11.2005, 16:37
Сеньк!
достаточно былобы вот этого.
arr = [];
arr[0] = [];
arr[0][1] = 1;
arr[0][2] = 2;
arr[0][3] = 3;

iNils
11.11.2005, 16:46
Сеньк!
достаточно былобы вот этого.
arr = [];
arr[0] = [];
arr[0][1] = 1;
arr[0][2] = 2;
arr[0][3] = 3;

ты хочешь сказать, что не не знал что:
arr = [1,2]
эквивалентно
arr = []
arr[0] = 1;
arr[1] = 2;

Whatsername
11.11.2005, 16:56
ты хочешь сказать, что не не знал что:
arr = [1,2]
эквивалентно
arr = []
arr[0] = 1;
arr[1] = 2;
Я хочу это сказать. Более того, я совершенно не вникаю, почему так происходит.

UPD: Ну ни фига се, я торможу... Да. Кофе. Срочно.

gun 242
11.11.2005, 16:58
нет.
я про эту строчку
arr[0] = [];

Whatsername
11.11.2005, 17:00
Но вот я не понимаю в

arr[[0, 1]] = 1;

[0, 1] - преобразуется к строке???