Install via yarn add locutus and import:
import { serialize } from 'locutus/php/var/serialize'.
Or with CommonJS: const { serialize } = require('locutus/php/var/serialize')
Use a bundler that supports tree-shaking so you only ship the functions you actually use.
Vite,
webpack,
Rollup, and
Parcel
all handle this. For server-side use this is less of a concern.
Examples
These examples are extracted from test cases that automatically verify our functions against their native counterparts.
We feel the main purpose of this function should be to ease
the transport of data between php & js
Aiming for PHP-compatibility, we have to translate objects to arrays
Dependencies
This function uses the following Locutus functions:
exportfunctionserialize(mixedValue: SerializeValue): string { // discuss at: https://locutus.io/php/serialize/ // original by: Arpad Ray (mailto:arpad@php.net) // improved by: Dino // improved by: Le Torbi (https://www.letorbi.de/) // improved by: Kevin van Zonneveld (https://kvz.io/) // bugfixed by: Andrej Pavlovic // bugfixed by: Garagoth // bugfixed by: Russell Walker (https://www.nbill.co.uk/) // bugfixed by: Jamie Beck (https://www.terabit.ca/) // bugfixed by: Kevin van Zonneveld (https://kvz.io/) // bugfixed by: Ben (https://benblume.co.uk/) // bugfixed by: Codestar (https://codestarlive.com/) // bugfixed by: idjem (https://github.com/idjem) // input by: DtTvB (https://dt.in.th/2008-09-16.string-length-in-bytes.html) // input by: Martin (https://www.erlenwiese.de/) // note 1: We feel the main purpose of this function should be to ease // note 1: the transport of data between php & js // note 1: Aiming for PHP-compatibility, we have to translate objects to arrays // example 1: serialize(['Kevin', 'van', 'Zonneveld']) // returns 1: 'a:3:{i:0;s:5:"Kevin";i:1;s:3:"van";i:2;s:9:"Zonneveld";}' // example 2: serialize({firstName: 'Kevin', midName: 'van'}) // returns 2: 'a:2:{s:9:"firstName";s:5:"Kevin";s:7:"midName";s:3:"van";}' // example 3: serialize( {'ü': 'ü', '四': '四', '𠜎': '𠜎'}) // returns 3: 'a:3:{s:2:"ü";s:2:"ü";s:3:"四";s:3:"四";s:4:"𠜎";s:4:"𠜎";}'
let val = '' letokey: number | string letktype: LocutusType = 'undefined' let vals = '' let count = 0
const _utf8Size = function (str: string): number { return ~-encodeURI(str).split(/%..|./).length }
exportfunctionserialize(mixedValue) { // discuss at: https://locutus.io/php/serialize/ // original by: Arpad Ray (mailto:arpad@php.net) // improved by: Dino // improved by: Le Torbi (https://www.letorbi.de/) // improved by: Kevin van Zonneveld (https://kvz.io/) // bugfixed by: Andrej Pavlovic // bugfixed by: Garagoth // bugfixed by: Russell Walker (https://www.nbill.co.uk/) // bugfixed by: Jamie Beck (https://www.terabit.ca/) // bugfixed by: Kevin van Zonneveld (https://kvz.io/) // bugfixed by: Ben (https://benblume.co.uk/) // bugfixed by: Codestar (https://codestarlive.com/) // bugfixed by: idjem (https://github.com/idjem) // input by: DtTvB (https://dt.in.th/2008-09-16.string-length-in-bytes.html) // input by: Martin (https://www.erlenwiese.de/) // note 1: We feel the main purpose of this function should be to ease // note 1: the transport of data between php & js // note 1: Aiming for PHP-compatibility, we have to translate objects to arrays // example 1: serialize(['Kevin', 'van', 'Zonneveld']) // returns 1: 'a:3:{i:0;s:5:"Kevin";i:1;s:3:"van";i:2;s:9:"Zonneveld";}' // example 2: serialize({firstName: 'Kevin', midName: 'van'}) // returns 2: 'a:2:{s:9:"firstName";s:5:"Kevin";s:7:"midName";s:3:"van";}' // example 3: serialize( {'ü': 'ü', '四': '四', '𠜎': '𠜎'}) // returns 3: 'a:3:{s:2:"ü";s:2:"ü";s:3:"四";s:3:"四";s:4:"𠜎";s:4:"𠜎";}'
let val = '' let okey let ktype = 'undefined' let vals = '' let count = 0
const _utf8Size = function (str) { return ~-encodeURI(str).split(/%..|./).length }
const _getType = function (inp) { let match let cons = '' const types = ['boolean', 'number', 'string', 'array'] const jsType = typeof inp let type = jsType === 'boolean' || jsType === 'number' || jsType === 'string' || jsType === 'function' || jsType === 'undefined' || jsType === 'object' ? jsType : 'undefined'
if (type === 'object' && !inp) { return'null' }
if (type === 'object' && typeof inp === 'object' && inp !== null) { const constructorValue = getPhpObjectEntry(inp, 'constructor') if (typeof constructorValue !== 'function') { return'object' } cons = constructorValue.toString() match = cons.match(/(\w+)\(/) if (match) { cons = (match[1] ?? '').toLowerCase() } for (const itemType of types) { if (cons === itemType) { type = itemType break } } } return type }
functionserialize(mixedValue: SerializeValue): string { // discuss at: https://locutus.io/php/serialize/ // original by: Arpad Ray (mailto:arpad@php.net) // improved by: Dino // improved by: Le Torbi (https://www.letorbi.de/) // improved by: Kevin van Zonneveld (https://kvz.io/) // bugfixed by: Andrej Pavlovic // bugfixed by: Garagoth // bugfixed by: Russell Walker (https://www.nbill.co.uk/) // bugfixed by: Jamie Beck (https://www.terabit.ca/) // bugfixed by: Kevin van Zonneveld (https://kvz.io/) // bugfixed by: Ben (https://benblume.co.uk/) // bugfixed by: Codestar (https://codestarlive.com/) // bugfixed by: idjem (https://github.com/idjem) // input by: DtTvB (https://dt.in.th/2008-09-16.string-length-in-bytes.html) // input by: Martin (https://www.erlenwiese.de/) // note 1: We feel the main purpose of this function should be to ease // note 1: the transport of data between php & js // note 1: Aiming for PHP-compatibility, we have to translate objects to arrays // example 1: serialize(['Kevin', 'van', 'Zonneveld']) // returns 1: 'a:3:{i:0;s:5:"Kevin";i:1;s:3:"van";i:2;s:9:"Zonneveld";}' // example 2: serialize({firstName: 'Kevin', midName: 'van'}) // returns 2: 'a:2:{s:9:"firstName";s:5:"Kevin";s:7:"midName";s:3:"van";}' // example 3: serialize( {'ü': 'ü', '四': '四', '𠜎': '𠜎'}) // returns 3: 'a:3:{s:2:"ü";s:2:"ü";s:3:"四";s:3:"四";s:4:"𠜎";s:4:"𠜎";}'
let val = '' letokey: number | string letktype: LocutusType = 'undefined' let vals = '' let count = 0
const _utf8Size = function (str: string): number { return ~-encodeURI(str).split(/%..|./).length }
okey = key.match(/^[0-9]+$/) ? parseInt(key, 10) : key vals += serialize(okey) + serialize(entry) count++ } val += ':' + count + ':{' + vals + '}' break } case'undefined': default: // Fall-through // if the JS object has a property which contains a null value, // the string cannot be unserialized by PHP val = 'N' break } if (type !== 'object' && type !== 'array') { val += ';' }
return val }
// php/_helpers/_phpTypes (Locutus helper dependency) functionisPhpArrayObject(value) { returntypeof value === 'object' && value !== null }
functiontoPhpArrayObject(value) { if (isPhpArrayObject(value)) { return value }
return {} }
// php/_helpers/_phpRuntimeState (Locutus helper dependency) functiongetPhpObjectEntry(value, key) { if ((typeof value !== 'object' && typeof value !== 'function') || value === null) { returnundefined }
let current = value while (current) { const descriptor = Object.getOwnPropertyDescriptor(current, key) if (descriptor) { if (typeof descriptor.get === 'function') { const getterValue = descriptor.get.call(value) returntypeof getterValue === 'undefined' ? undefined : getterValue } const directValue = descriptor.value returntypeof directValue === 'undefined' ? undefined : directValue } current = Object.getPrototypeOf(current) }
returnundefined }
// php/var/serialize (target function module) functionserialize(mixedValue) { // discuss at: https://locutus.io/php/serialize/ // original by: Arpad Ray (mailto:arpad@php.net) // improved by: Dino // improved by: Le Torbi (https://www.letorbi.de/) // improved by: Kevin van Zonneveld (https://kvz.io/) // bugfixed by: Andrej Pavlovic // bugfixed by: Garagoth // bugfixed by: Russell Walker (https://www.nbill.co.uk/) // bugfixed by: Jamie Beck (https://www.terabit.ca/) // bugfixed by: Kevin van Zonneveld (https://kvz.io/) // bugfixed by: Ben (https://benblume.co.uk/) // bugfixed by: Codestar (https://codestarlive.com/) // bugfixed by: idjem (https://github.com/idjem) // input by: DtTvB (https://dt.in.th/2008-09-16.string-length-in-bytes.html) // input by: Martin (https://www.erlenwiese.de/) // note 1: We feel the main purpose of this function should be to ease // note 1: the transport of data between php & js // note 1: Aiming for PHP-compatibility, we have to translate objects to arrays // example 1: serialize(['Kevin', 'van', 'Zonneveld']) // returns 1: 'a:3:{i:0;s:5:"Kevin";i:1;s:3:"van";i:2;s:9:"Zonneveld";}' // example 2: serialize({firstName: 'Kevin', midName: 'van'}) // returns 2: 'a:2:{s:9:"firstName";s:5:"Kevin";s:7:"midName";s:3:"van";}' // example 3: serialize( {'ü': 'ü', '四': '四', '𠜎': '𠜎'}) // returns 3: 'a:3:{s:2:"ü";s:2:"ü";s:3:"四";s:3:"四";s:4:"𠜎";s:4:"𠜎";}'
let val = '' let okey let ktype = 'undefined' let vals = '' let count = 0
const _utf8Size = function (str) { return ~-encodeURI(str).split(/%..|./).length }
const _getType = function (inp) { let match let cons = '' const types = ['boolean', 'number', 'string', 'array'] const jsType = typeof inp let type = jsType === 'boolean' || jsType === 'number' || jsType === 'string' || jsType === 'function' || jsType === 'undefined' || jsType === 'object' ? jsType : 'undefined'
if (type === 'object' && !inp) { return'null' }
if (type === 'object' && typeof inp === 'object' && inp !== null) { const constructorValue = getPhpObjectEntry(inp, 'constructor') if (typeof constructorValue !== 'function') { return'object' } cons = constructorValue.toString() match = cons.match(/(\w+)\(/) if (match) { cons = (match[1] ?? '').toLowerCase() } for (const itemType of types) { if (cons === itemType) { type = itemType break } } } return type }
okey = key.match(/^[0-9]+$/) ? parseInt(key, 10) : key vals += serialize(okey) + serialize(entry) count++ } val += ':' + count + ':{' + vals + '}' break } case'undefined': default: // Fall-through // if the JS object has a property which contains a null value, // the string cannot be unserialized by PHP val = 'N' break } if (type !== 'object' && type !== 'array') { val += ';' }
return val }
Improve this function
Locutus is a community effort following
The McDonald's Theory:
we ship first iterations, hoping others will improve them.
If you see something that could be better, we'd love your contribution.