Strict Standards: Resource ID#36 used as offset, casting to integer (36) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401

Strict Standards: Resource ID#38 used as offset, casting to integer (38) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401

Strict Standards: Resource ID#39 used as offset, casting to integer (39) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/fm.class.php on line 401
ТвойWeb :: Версия для печати :: превращение массива в строку и обратно
ТвойWeb » WebMaster класс » JavaScript » превращение массива в строку и обратно

Страниц (5): [1] 2 3 4 5 »
 

1. kr12 - 11 Сентября, 2005 - 07:26:51 - перейти к сообщению
Вот функции, кодирующие многомерный элемент в строку и восстанавливающие. Есть 2 проблеммы:
1. Функция codeFMas изменяет исходный массив, хотя по моему бы не должна
2. Почему tmpArr доступен вне функции?
Примечание: можно было обойтись без eval, но о методе slice() и др. я прочитал только недавно Недовольство, огорчение.
CODE:

<script>
function crMass(name,a,b,c,d){ //-размерность массива
eval(name + " = new Array()")
for(var i=-1;i<a;i++){
eval(name+"["+i+"] = new Array()")
for(var i1=-1;i1<b;i1++){
eval(name+"["+i+"]["+i1+"] = new Array()")
for(var i2=-1;i2<=c;i2++){
eval(name+"["+i+"]["+i1+"]["+i2+"] = new Array()")
eval(name+"["+i+"]["+i1+"]["+i2+"] = '"+i+""+i1+""+i2+"'") //debag
for(var i3=-1;i3<d;i3++){
eval(name+"["+i+"]["+i1+"]["+i2+"]["+i3+"] = new Array()")
}
}
}
}
}

function codeFMas(name,x,x1,x2){ //x0=',' ! (x,x1,x2 = '#' '^' '@' или др)
this.tmpArr=eval(name+'.slice()')

for(var i=0;this.tmpArr[i]!=undefined;i++){
for(var i1=0;this.tmpArr[i][i1]!=undefined;i1++){
for(var i2=0;this.tmpArr[i][i1][i2]!=undefined;i2++){
for(var i3=0;this.tmpArr[i][i1][i2][i3]!=undefined;i3++){}
this.tmpArr[i][i1][i2][i3]=x2
}
this.tmpArr[i][i1][i2]=x1
}
this.tmpArr[i][i1]=x
}
return this.tmpArr;
}

function decodeFMas(var1,name,x,x1,x2){ //var1 декодируется в массив name; x,x1,x2 = '#' '^' '@'
a1='';a2='';

eval(name + " = new Array()")
eval(name + " = '"+var1+"'.split('"+x+",')")
for(var i=0;eval(name + "["+i+"]")!=undefined;i++){
if(eval(name + "["+i+"]").indexOf(x1)!=-1){
a1="["+'i1'+"]"
tmpp=eval(name+"["+i+"]"); document.write(tmpp+'<BR>')
eval(name+"["+i+"] = new Array()")
eval(name+"["+i+"]=tmpp.substring(0,tmpp.lastIndexOf(',')).split('"+x1+",')")
}
for(var i1=0;eval(name+"["+i+"]"+a1)!=undefined;i1++){
if(eval(name+"["+i+"]"+a1).indexOf(x2)!=-1){
a2="["+'i2'+"]";
tmpp=eval(name+"["+i+"]"+a1)
eval(name+"["+i+"]"+a1+" = new Array()")
eval(name+"["+i+"]"+a1+" = tmpp.substring(0,tmpp.lastIndexOf(',')).split('"+x2+",')")
}
for(var i1=0;eval(name+"["+i+"]"+a1+a2)!=undefined;i1++){
if(eval(name+"["+i+"]"+a1+a2).indexOf(',')!=-1){
tmpp=eval(name+"["+i+"]"+a1+a2)
eval(name+"["+i+"]"+a1+a2+" = new Array()")
eval(name+"["+i+"]"+a1+a2+" = tmpp.substring(0,tmpp.lastIndexOf(',')).split(',')")
}}
}
}
}


crMass('aa',3,3,6)
//aa[2]='s';aa[0][0][0]=0;aa[0][0][1]=1;aa[1][0]=10;aa[1][2][2]=21
document.write('массив<a style="position:absolute;left:160px">'+aa+'</a><BR>')

aa1=codeFMas('aa','#','^','@')
document.write('измененный&nbsp;массив<a style="position:absolute;left:160px">'+aa+'</a><BR>')
document.write('временный&nbsp;массив<a style="position:absolute;left:160px">'+tmpArr+'</a><BR>')
document.write('строка<a style="position:absolute;left:160px">'+aa1+'</a><BR>')

decodeFMas(aa1,'aa2','#','^','@')
document.write('восстановлен&nbsp;массив<a style="position:absolute;left:160px">'+aa2+'</a><BR>')

document.write('<BR><BR>'+aa2[2])
document.write('<BR><BR>'+aa2[2][2][0])
</script>

P.S.: может быть можно это сделать как-то проще и для массивов любой размерности?
2. ETC - 11 Сентября, 2005 - 08:04:30 - перейти к сообщению
CODE:
this.tmpArr=eval(name+'.slice()')
?
CODE:
vat tmpArr=eval(name+'.slice()')
!
и не будет доступно извне...
И ваще бяка какая-то, зачем тебе она?
3. kr12 - 11 Сентября, 2005 - 13:09:44 - перейти к сообщению
vat ? ты имел в виду var. Да вспомнил. Но меня больше интересует решение первого вопроса.
зачем? Ну, допустим, нужно сохранить многомерный массив в файл. Я не знаю как это сделать проще.
4. Леголегс - 11 Сентября, 2005 - 14:27:16 - перейти к сообщению
kr12
У массива есть сойство length. Вообще-то если хочешь сделать полезную универсальную функцию сделай аналог phpшной serialize.
Советы: всё можно сделать без единого eval, лучше сделать функцию для одномерного массива но с рекурсивным вызовом (один параметр функции - размерность массива).
5. RaZoR - 12 Сентября, 2005 - 08:45:28 - перейти к сообщению
вот аналог функции serialize:
CODE:
<script>
var arrSerialized = new Object();
var _maxRecursionLevels = 1000;
var _currentRecursionLevel = 0;

function addslashes(sString)
{
return sString.replace(/\'/g, "\'");
}

function serialize(oInput)
{
if (_currentRecursionLevel > _maxRecursionLevels) return 'N;';
if (oInput.constructor)
{
var arrMatches = /function ([0-9a-z_]+)/i.exec(oInput.constructor.toString())
switch (arrMatches[1].toLowerCase())
{
case "number" :
if (Math.round(oInput) == oInput)
{
return 'i:' + oInput + ';'; //integer
}
else
{
return 'd:' + oInput + ';'; //float
}
break;
case "string" :
/*
oInput=oInput.replace(/\\/g, "\\\\")
oInput=oInput.replace(/\"/g, "\\\"")
oInput=oInput.replace(/\n/g, "\\n")
oInput=oInput.replace(/\r/g, "")
*/
return 's:'+oInput.length+':"'+oInput+'";';
break;
case "boolean" :
return (oInput == true) ? 'b:1;' : 'b:0;';
break;
case "function" :
return 'N;'; //returns a Null variable for functions
break;
case "array" :
var s = 'a:'+oInput.length+':{';
for (var i=0; i<oInput.length; i++)
{
s += 'i:'+i+';'+serialize(oInput[i]);
}
s += '}';
return s
break;
case "object" :
var o=oInput
if (o==null || typeof(o)=='undefined' || (o + '')==undefined) return 'N;';

var s='';
var count=0;
for (var item in o)
{
count++;
{
bolSerialized = false;
if (arrSerialized[item])
{
for (var i=0; i<arrSerialized[item].length && !bolSerialized; i++)
{
bolSerialized = (arrSerialized[item][i] === o[item]);
}
if (bolSerialized)
{
s +='N;';
}
else
{
arrSerialized[item][arrSerialized[item].length] = o[item];
}
}
else
{
arrSerialized[item] = [o[item]];
}
if (o[item] !== o && !bolSerialized)
{
_currentRecursionLevel++;
s += 's:'+item.length+':"'+item+'";' + serialize(o[item]);
_currentRecursionLevel--;
}
}
}
s = 'a:'+count+':{'+s+'}';
return s
break;
}
return '';
}
}

function print_js(_MyArray)
{
var _str="";
_str += isNaN(_MyArray.length) ? "{" : "[";
_str += (((_str == "{") || (_str == "[")) ? "" : ",");
for (var j in _MyArray)
{
switch (typeof(_MyArray[j]))
{
case "number":
{
_str += (((_str == "{") || (_str == "[")) ? "" : ",");
if (isNaN(_MyArray.length))
{
_str += "'"+j+"':"+_MyArray[j];
}
else
{
_str += _MyArray[j];
}
} break;
case "string":
{
_str += (((_str == "{") || (_str == "[")) ? "" : ",");
if (isNaN(_MyArray.length))
{
_str += "'"+j+"':'"+_MyArray[j]+"'";
}
else
{
_str += "'"+_MyArray[j]+"'";
}
} break;
case "object":
{
if (isNaN(_MyArray.length))
{
_str += (((_str == "{") || (_str == "[")) ? "" : ",");
_str += "'"+j+"':";
}
else
{
_str += (((_str == "{") || (_str == "[")) ? "" : ",");
}
_str += print_js(_MyArray[j]);
} break;
}
}
_str += isNaN(_MyArray.length) ? "}" : "]";
return _str;
}
</script>

Функции не мои, но вроде работают правильно. Только вот unserialize нету. Но если нужно, можно по аналогии написать.
6. kr12 - 08 Октября, 2005 - 02:03:28 - перейти к сообщению
Между прочим toString() и print_js() не понимают ассоциативных массивов. Есть какие-нибудь соображение о том как их сохранить в файл?
7. Дмитрий Б. - 08 Октября, 2005 - 04:28:51 - перейти к сообщению
Соображения? Сесть и написать.
8. Дмитрий Б. - 09 Октября, 2005 - 00:38:29 - перейти к сообщению
Тебе надо? Если да, то скажу своё слово...
9. kr12 - 13 Октября, 2005 - 02:22:30 - перейти к сообщению
Ну, если не сложно. Мне бы принцып знать. Может исспользовать for(in object)?
10. Дмитрий Б. - 14 Октября, 2005 - 06:10:07 - перейти к сообщению
CODE:
String.prototype.change=function()
{
var i, s=this;
for (i=0; i<arguments.length; i+=2) s=s.split(arguments[i]).join(arguments[i+1]);
return s;
}

String.prototype.toJSFormat=function()
{
return '"'+this.change('\\', '\\\\', '\'', '\\\'', '"', '\"', '\n', '\\n', '\r', '\\r', '\t', '\\t')+'"';
}

function arrayToString(n, l)
{
var name, value, x=n+'=new Array();';

for (name in l)
{
value=l[name];

switch(typeof(value))
{
case 'number': case 'boolean':
x+=n+'['+name.toJSFormat()+']='+value+';';
break;
case 'string':
x+=n+'['+name.toJSFormat()+']='+value.toJSFormat()+';';
break;
default:
if (value instanceof Array)
x+=arrayToString(n+'['+name.toJSFormat()+']', value);
else return null;
}
}
return x;
}

Форум на AlfaSpace.NET


Powered by ExBB
ExBB FM 1.0 RC1 by TvoyWeb.ru
InvisionExBB Style converted by Markus®

[Script Execution time: 0.0421]     [ Gzipped ]



Notice: ob_end_flush(): failed to send buffer of ob_gzhandler (1) in /home/tvoyweb/domains/tvoyweb.ru/public_html/forums/include/page_tail.php on line 33