PDA

Просмотр полной версии : Проблема с двумерным массивом


bulya123
25.09.2008, 14:31
Добрый день, совсем запутался, возникла проблема с двумерным массивом

var filename_list = new Array();
var filepath:String = "portfolio/spec/";

var content_xml = new XML();
content_xml.ignoreWhite = true;
content_xml.onLoad = function() {
var node:Array = this.firstChild.childNodes;
for (var i = 0; i<node.length; i++) {
var nodes:Array = this.firstChild.childNodes[i].childNodes;

for (var j = 0; j<nodes.length; j++) {

filename_list[i, j] = nodes[j].attributes.filename;
trace(filename_list[i, j])//здесь выводит все нормально

}
}
trace(filename_list)//а здесь выводить только последние значения
};
content_xml.load("specproject.xml");
Структура XML приблизительно такая:

<?xml version="1.0" encoding="windows-1251"?>
<portfolio>
<items label="TORQUE">
<item filename="port01.png" />
<item filename="port02.png" />
<item filename="port03.png" />
</items>
<items label="GRAND PRIX">
<item filename="port04.png" />
<item filename="port05.png" />
<item filename="port06.png" />
</items>
<items label="ЕВРОФАРМ">
<item filename="port07.png" />
<item filename="port08.png" />
<item filename="port09.png" />
<item filename="port09.png" />
</items>
</portfolio>

Не могу понять в чем дело:confused:
Буду благодарен за помощь:)

Doctor76
25.09.2008, 14:46
Я вместо этой строки
filename_list[i, j] = nodes[j].attributes.filename;


Написал так:
filename_list.push(nodes[j].attributes.filename)

Работает вроде как..

dimarik
25.09.2008, 15:02
filename_list[i][j] = nodes[j].attributes.filename;

bulya123
30.09.2008, 12:17
filename_list[i][j] = nodes[j].attributes.filename;
Спасибо, то, что нужно, просто синтаксис перепутал:p

Я вместо этой строки
filename_list[i, j] = nodes[j].attributes.filename;


Написал так:
filename_list.push(nodes[j].attributes.filename)

Работает вроде как..
Нужен именно двумерный массив, а метод push делает одномерный прикрепляя в конец массива

iNils
30.09.2008, 12:40
bulya123, мультипостинг у нас запрещен, пользуйтесь кнопкой "мультицитата" и "изменить"

nOobCrafter
14.11.2008, 15:06
А если мне надо так же вывести "nodes.length", то что делать?..а то берется только последнее значение((

var filename_list = new Array();
var filepath:String = "";

var content_xml = new XML();
content_xml.ignoreWhite = true;
content_xml.onLoad = function()
{
var node:Array = this.firstChild.childNodes;
for (var i = 0; i<node.length; i++)
{
filename_list[i] = new Array();
var nodes:Array = this.firstChild.childNodes[i].childNodes;

for (var j = 0; j<nodes.length; j++)
{
filename_list[i][j] = nodes[j].attributes.filename;
}
trace("то как должно быть - " + nodes.length) // все ок =3, =4, =4
}
trace("то что получаем(( - " + nodes.length) // последнее значение = 4
};

content_xml.load("specproject.xml");

MrXoT
14.11.2008, 15:59
var filename_list = new Array();
var filepath:String = "portfolio/spec/";

var content_xml = new XML();
content_xml.ignoreWhite = true;
content_xml.onLoad = function(success:Boolean) {
if(success){
var node:Array = this.firstChild.childNodes;
for (var i = 0; i<node.length; i++) {
var nodes:Array = this.firstChild.childNodes[i].childNodes;
var nodes_length:Number = this.firstChild.childNodes[i].childNodes.length;
filename_list[i] = new Object();
filename_list[i]._length=nodes_length;
for (var j = 0; j<nodes.length; j++) {

var filename:String = nodes[j].attributes.filename;
filename_list[i][j] = new Object();
filename_list[i][j]._filename=filename;

}
}
trace(filename_list[1][0]._filename)
}
};
content_xml.load("specproject.xml");

nOobCrafter
14.11.2008, 16:54
2 MrXoT Ммм и что это нам дало?... Мне надо кол-во елементов. Немного подправил верхний пост, что бы было понятно что именно мне надо.

MrXoT
14.11.2008, 17:36
все очень просто...
Задаем массив как обьект...
и к нему можно легко общаться...
очень удобно если 1 поле в хмл имеет много параметров...
например если человек добавит новое поле title="" то твой вариант не получится
а мой просто при добавлении поля filename_list[i][j]._title = title;
и все....

nOobCrafter
14.11.2008, 17:53
Ммм у нас небольшое недопонимаение.
Мне НЕ надо узнавать что и где находится, с этим у меня все ок. Мне надо узнать КОЛ-ВО элементов ВТОРОГО массива, для каждого элемента первого отдельно. А у меня выводит только кол-во елементов последнего массива (i = 2). (в коде старался это отразить.)

З.Ы.
например если человек добавит новое поле title="" то твой вариант не получится
я использую 3 параметра и все у меня корректно отображается.(могу хоть 10, не в том суть)
<?xml version="1.0" encoding="utf-8" ?>
<header>
<items razdel="Безопасность">
<item title="1.1"
description="Сегодня запущен сайт в тестовом режиме."
image="thumbnails/Cotton_Buds.jpg" />

nOobCrafter
17.11.2008, 18:40
Извиняюсь за ап, но тема актуальна.

Mnilionic
17.11.2008, 19:29
а зачем вообще xml переделывать в массив?
если очень нужно то вызывайте свойство length нужного массива и узнаете длинну.

или можно переписать xml в массив своих объектов, что, в принципе не имеет смысла при однородном xml


var filename_list = new Array();
var filepath:String = "";

var content_xml = new XML();
content_xml.ignoreWhite = true;

content_xml.onLoad = function() {
var items = this.firstChild.firstChild;
var i = 0;

while(items){
filename_list[i] = new Object();
filename_list[i].values = new Array();

var item = items.firstChild;
var count = 0;
while(item){
filename_list[i].values.push( item.attributes['filename'] );
// ->
item = item.nextSibling;
count++;
}
filename_list[i].count = count;
filename_list[i].label = items.attributes['label'];
// ->
items = items.nextSibling;
i++;
}
trace(filename_list[0].label + ': (' + filename_list[0].values + ') всего: ' + filename_list[0].count)
trace(filename_list[1].label + ': (' + filename_list[1].values + ') всего: ' + filename_list[1].count)
trace('и тд')
};
content_xml.load("specproject.xml");