def PHP.serialize(var, assoc = false)
s = ''
case var
when Array
s << "a:#{var.size}:{"
if assoc and var.first.is_a?(Array) and var.first.size == 2
var.each { |k,v|
s << PHP.serialize(k) << PHP.serialize(v)
}
else
var.each_with_index { |v,i|
s << "i:#{i};#{PHP.serialize(v)}"
}
end
s << '}'
when Hash
s << "a:#{var.size}:{"
var.each do |k,v|
s << "#{PHP.serialize(k)}#{PHP.serialize(v)}"
end
s << '}'
when Struct
s << "O:#{var.class.to_s.length}:\"#{var.class.to_s.downcase}\":#{var.members.length}:{"
var.members.each do |member|
s << "#{PHP.serialize(member)}#{PHP.serialize(var[member])}"
end
s << '}'
when String
s << "s:#{var.length}:\"#{var}\";"
when Fixnum
s << "i:#{var};"
when Float
s << "d:#{var};"
when NilClass
s << 'N;'
when FalseClass, TrueClass
s << "b:#{var ? 1 :0};"
else
if var.respond_to?(:to_assoc)
v = var.to_assoc
s << "O:#{var.class.to_s.length}:\"#{var.class.to_s.downcase}\":#{v.length}:{"
v.each do |k,v|
s << "#{PHP.serialize(k.to_s)}#{PHP.serialize(v)}"
end
s << '}'
else
raise TypeError, "Unable to serialize type #{var.class}"
end
end
s
end