|
|
Javascript:
function serialize( mixed_val ) { // Generates a storable representation of a value
//
// + original by: Ates Goral (http://magnetiq.com)
// + adapted for IE: Ilia Kantor (http://javascript.ru)
switch (typeof(mixed_val)){
case "number":
if (isNaN(mixed_val) || !isFinite(mixed_val)){
return false;
} else{
return (Math.floor(mixed_val) == mixed_val ? "i" : "d") + ":" + mixed_val + ";";
}
case "string":
return "s:" + mixed_val.length + ":\"" + mixed_val + "\";";
case "boolean":
return "b:" + (mixed_val ? "1" : "0") + ";";
case "object":
if (mixed_val == null) {
return "N;";
} else if (mixed_val instanceof Array) {
var idxobj = { idx: -1 };
var map = []
for(var i=0; i<mixed_val.length;i++) {
idxobj.idx++;
var ser = serialize(mixed_val[i]);
if (ser) {
map.push(serialize(idxobj.idx) + ser)
}
}
return "a:" + mixed_val.length + ":{" + map.join("") + "}"
}
else {
var class_name = get_class(mixed_val);
if (class_name == undefined){
return false;
}
var props = new Array();
for (var prop in mixed_val) {
var ser = serialize(mixed_val[prop]);
if (ser) {
props.push(serialize(prop) + ser);
}
}
return "O:" + class_name.length + ":\"" + class_name + "\":" + props.length + ":{" + props.join("") + "}";
}
case "undefined":
return "N;";
}
return false;
}
Примеры:
serialize(['Kevin', 'van', 'Zonneveld']);
'a:3:{i:0;s:5:"Kevin";i:1;s:3:"van";i:2;s:9:"Zonneveld";}'
serialize(3.14);
'd:3.14;'
serialize("foo");
's:3:"foo";'
serialize(new Object());
'O:6:"Object":0:{}'
serialize(new (function MyClass() {}));
'O:7:"MyClass":0:{}'
serialize(new (function MyClass() { this.prop = 42 }));
'O:7:"MyClass":1:{s:4:"prop";i:42;}'
serialize(new Array());
'a:0:{}'
serialize([1, 3]);
'a:2:{i:0;i:1;i:1;i:3;}'
serialize(undefined);
'N;'
serialize(Infinity);
false;
serialize(function doit() {});
false;
|
|
|
|
|
Поиск по сайту
|
|
|
Реклама
|
|
|
Содержание
|
|
|
Последние обсуждения на форуме
|
| Forum |
Последние комментарии
|
|
|
|
|
|
|
Greetings!
There is a problem using this function in Internet Explorer or opera, it did not work.
I`m using this function to serialize javascript array data.
Is there any solution to work?
Thanks for your report.
Function is fixed and tested against IE7, Opera 9.5. Should also work in lower versions.
У меня на сервере PHP, почему то не разбирает, то, что выдаёт эта функция. Я разобрался в чём проблема. Строка сериализованная через PHP с русскими символами выглядит так: s:12:"Вопрос", то есть на каждый символ уходит по 2 байта, а на каждый латинский по одному ( s:13:"ВопросD" ). Данный скрипт считает количество символов не разбирая кодировку. Я написал простую функцию:
function get_length(val){ var counter = 0; for(i=0; val.length>i; i++) if( /[абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ]/.test(val[i]) ) counter += 2; else counter++; return counter; }и поместил её вызов вот сюда:
Всё заработало. Возможно конечно, что это проблема наблюдается только у меня из-за специфики системы.
( Windows7+ZendServer+apache2 )
Отправить комментарий
Приветствуются комментарии:- Полезные.
- Дополняющие прочитанное.
- Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.Для остальных вопросов и обсуждений есть форум.