Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 26.12.2012, 20:07
Аспирант
Отправить личное сообщение для zebulun Посмотреть профиль Найти все сообщения от zebulun
 
Регистрация: 01.09.2011
Сообщений: 39

не работает функция unserialize
нормальный сериализованный массив функция не десериализует!
или есть у кого-то рабочая функция, котор. десериализует обьект, сериализованный функцией пхп serialize?
function unserialize ( inp ){	// Creates a PHP value from a stored representation
	//
	// +   original by: Arpad Ray (mailto:arpad@php.net)

	error = 0;
	if (inp == "" || inp.length < 2) {
		errormsg = "input is too short";
		return;
	}
	var val, kret, vret, cval;
	var type = inp.charAt(0);
	var cont = inp.substring(2);
	var size = 0, divpos = 0, endcont = 0, rest = "", next = "";

	switch (type) {
	case "N": // null
		if (inp.charAt(1) != ";") {
			errormsg = "missing ; for null";
		}
		// leave val undefined
		rest = cont;
		break;
	case "b": // boolean
		if (!/[01];/.test(cont.substring(0,2))) {
			errormsg = "value not 0 or 1, or missing ; for boolean";
		}
		val = (cont.charAt(0) == "1");
		rest = cont.substring(1);
		break;
	case "s": // string
		val = "";
		divpos = cont.indexOf(":");
		if (divpos == -1) {
			errormsg = "missing : for string";
			break;
		}
		size = parseInt(cont.substring(0, divpos));
		if (size == 0) {
			if (cont.length - divpos < 4) {
				errormsg = "string is too short";
				break;
			}
			rest = cont.substring(divpos + 4);
			break;
		}
		if ((cont.length - divpos - size) < 4) {
			errormsg = "string is too short";
			break;
		}
		if (cont.substring(divpos + 2 + size, divpos + 4 + size) != "\";") {
			errormsg = "string is too long, or missing \";";
		}
		val = cont.substring(divpos + 2, divpos + 2 + size);
		rest = cont.substring(divpos + 4 + size);
		break;
	case "i": // integer
	case "d": // float
		var dotfound = 0;
		for (var i = 0; i < cont.length; i++) {
			cval = cont.charAt(i);
			if (isNaN(parseInt(cval)) && !(type == "d" && cval == "." && !dotfound++)) {
				endcont = i;
				break;
			}
		}
		if (!endcont || cont.charAt(endcont) != ";") {
			errormsg = "missing or invalid value, or missing ; for int/float";
		}
		val = cont.substring(0, endcont);
		val = (type == "i" ? parseInt(val) : parseFloat(val));
		rest = cont.substring(endcont + 1);
		break;
	case "a": // array
		if (cont.length < 4) {
			errormsg = "array is too short";
			return;
		}
		divpos = cont.indexOf(":", 1);
		if (divpos == -1) {
			errormsg = "missing : for array";
			return;
		}
		//size = parseInt(cont.substring(1, divpos - 1));
		size = parseInt(cont.substring(0, divpos));
		cont = cont.substring(divpos + 2);
		val = new Array();
		if (cont.length < 1) {
			errormsg = "array is too short";
			return;
		}
		for (var i = 0; i + 1 < size * 2; i += 2) {
			kret = unserialize(cont, 1);
			if (error || kret[0] == undefined || kret[1] == "") {
				errormsg = "missing or invalid key, or missing value for array";
				return;
			}
			vret = unserialize(kret[1], 1);
			if (error) {
				errormsg = "invalid value for array";
				return;
			}
			val[kret[0]] = vret[0];
			cont = vret[1];
		}
		if (cont.charAt(0) != "}") {
			errormsg = "missing ending }, or too many values for array";
			return;
		}
		rest = cont.substring(1);
		break;
	case "O": // object
		divpos = cont.indexOf(":");
		if (divpos == -1) {
			errormsg = "missing : for object";
			return;
		}
		size = parseInt(cont.substring(0, divpos));
		var objname = cont.substring(divpos + 2, divpos + 2 + size);
		if (cont.substring(divpos + 2 + size, divpos + 4 + size) != "\":") {
			errormsg = "object name is too long, or missing \":";
			return;
		}
		var objprops = unserialize("a:" + cont.substring(divpos + 4 + size), 1);
		if (error) {
			errormsg = "invalid object properties";
			return;
		}
		rest = objprops[1];
		var objout = "function " + objname + "(){";
		for (key in objprops[0]) {
			objout += "" + key + "=objprops[0]['" + key + "'];";
		}
		objout += "}val=new " + objname + "();";
		eval(objout);
		break;
	default:
		errormsg = "invalid input type";
	}
	return (arguments.length == 1 ? val : [val, rest]);
}
var phones=unserialize('a:3:{i:0;s:14:"(111)111-11-11";i:1;s:14:"(222)222-22-22";i:2;b:0;}');
alert(phones);
почему undefined?
Ответить с цитированием
  #2 (permalink)  
Старый 26.12.2012, 21:33
Аватар для nerv_
junior
Отправить личное сообщение для nerv_ Посмотреть профиль Найти все сообщения от nerv_
 
Регистрация: 29.11.2011
Сообщений: 3,924

JSON
__________________
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук
Ответить с цитированием
  #3 (permalink)  
Старый 26.12.2012, 21:38
Аспирант
Отправить личное сообщение для zebulun Посмотреть профиль Найти все сообщения от zebulun
 
Регистрация: 01.09.2011
Сообщений: 39

а при чем тут это, если мне надо десериализовать из php?
Ответить с цитированием
  #4 (permalink)  
Старый 28.12.2012, 17:47
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,077

zebulun,
А вот так работает ...
function unserialize ( inp ){	// Creates a PHP value from a stored representation
	//
	// +   original by: Arpad Ray (mailto:arpad@php.net)

	error = 0;
	if (inp == "" || inp.length < 2) {
		errormsg = "input is too short";
		return;
	}
	var val, kret, vret, cval;
	var type = inp.charAt(0);
	var cont = inp.substring(2);
	var size = 0, divpos = 0, endcont = 0, rest = "", next = "";

	switch (type) {
	case "N": // null
		if (inp.charAt(1) != ";") {
			errormsg = "missing ; for null";
		}
		// leave val undefined
		rest = cont;
		break;
	case "b": // boolean
		if (!/[01];/.test(cont.substring(0,2))) {
			errormsg = "value not 0 or 1, or missing ; for boolean";
		}
		val = (cont.charAt(0) == "1");
		rest = cont.substring(1);
		break;
	case "s": // string
		val = "";
		divpos = cont.indexOf(":");
		if (divpos == -1) {
			errormsg = "missing : for string";
			break;
		}
		size = parseInt(cont.substring(0, divpos));
		if (size == 0) {
			if (cont.length - divpos < 4) {
				errormsg = "string is too short";
				break;
			}
			rest = cont.substring(divpos + 4);
			break;
		}
		if ((cont.length - divpos - size) < 4) {
			errormsg = "string is too short";
			break;
		}
		if (cont.substring(divpos + 2 + size, divpos + 4 + size) != "\";") {
			errormsg = "string is too long, or missing \";";
		}
		val = cont.substring(divpos + 2, divpos + 2 + size);
		rest = cont.substring(divpos + 4 + size);
		break;
	case "i": // integer
	case "d": // float
		var dotfound = 0;
		for (var i = 0; i < cont.length; i++) {
			cval = cont.charAt(i);
			if (isNaN(parseInt(cval)) && !(type == "d" && cval == "." && !dotfound++)) {
				endcont = i;
				break;
			}
		}
		if (!endcont || cont.charAt(endcont) != ";") {
			errormsg = "missing or invalid value, or missing ; for int/float";
		}
		val = cont.substring(0, endcont);
		val = (type == "i" ? parseInt(val) : parseFloat(val));
		rest = cont.substring(endcont + 1);
		break;
	case "a": // array
		if (cont.length < 4) {
			errormsg = "array is too short";
			return;
		}
		divpos = cont.indexOf(":", 1);
		if (divpos == -1) {
			errormsg = "missing : for array";
			return;
		}
		//size = parseInt(cont.substring(1, divpos - 1));
		size = parseInt(cont.substring(0, divpos));
		cont = cont.substring(divpos + 2);
		val = new Array();
		if (cont.length < 1) {
			errormsg = "array is too short";
			return;
		}
		for (var i = 0; i + 1 < size * 2; i += 2) {
			kret = unserialize(cont, 1);
			if (error || kret[0] == undefined || kret[1] == "") {
				errormsg = "missing or invalid key, or missing value for array";
				return;
			}
			vret = unserialize(kret[1], 1);
			if (error) {
				errormsg = "invalid value for array";
				return;
			}
			val[kret[0]] = vret[0];
			cont = vret[1];
		}
		if (cont.charAt(0) != "}") {
			errormsg = "missing ending }, or too many values for array";
			return;
		}
		rest = cont.substring(1);
		break;
	case "O": // object
		divpos = cont.indexOf(":");
		if (divpos == -1) {
			errormsg = "missing : for object";
			return;
		}
		size = parseInt(cont.substring(0, divpos));
		var objname = cont.substring(divpos + 2, divpos + 2 + size);
		if (cont.substring(divpos + 2 + size, divpos + 4 + size) != "\":") {
			errormsg = "object name is too long, or missing \":";
			return;
		}
		var objprops = unserialize("a:" + cont.substring(divpos + 4 + size), 1);
		if (error) {
			errormsg = "invalid object properties";
			return;
		}
		rest = objprops[1];
		var objout = "function " + objname + "(){";
		for (key in objprops[0]) {
			objout += "" + key + "=objprops[0]['" + key + "'];";
		}
		objout += "}val=new " + objname + "();";
		eval(objout);
		break;
	default:
		errormsg = "invalid input type";
	}
	return (arguments.length == 1 ? val : [val, rest]);
}
var phones=unserialize('a:3:{i:0;s:14:"(111)111-11-11";i:1;s:14:"(222)222-22-22";i:2;b:0}');

alert(phones);
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Замена значения в store страно работает I3ev ExtJS 0 09.12.2012 14:22
НЕ работает функция length Golovastik Серверные языки и технологии 4 14.02.2011 17:31
Не работает функция инфоокна tomAlba Общие вопросы Javascript 0 30.01.2011 00:54
ява-скрипт выборочно работает-не работает zeta777 Internet Explorer 0 20.01.2010 11:41
Не работает eval в IE ..::Silence::.. Общие вопросы Javascript 8 25.03.2009 13:16