<?php
    define('URL_BASE64_FROM', '+/');
    define('URL_BASE64_TO', '-_');
    function url_base64_encode($data) {
        $encoded = base64_encode($data);
        if ($encoded === false) {
            return false;
        }
        return str_replace('=', '', strtr($encoded, URL_BASE64_FROM, URL_BASE64_TO));
    }
    function url_base64_decode($data) {
        $len = strlen($data);
        if (is_null($len)) {
            return false;
        }
        $padded = str_pad($data, 4 - $len % 4, '=', STR_PAD_RIGHT);
        return base64_decode(strtr($padded, URL_BASE64_TO, URL_BASE64_FROM));
    }
    define('PACK_NUMS_FORMAT', 'n*');
    function pack_nums($num_arr) {
        array_unshift($num_arr, PACK_NUMS_FORMAT);
        return call_user_func_array('pack', $num_arr);
    }
    function unpack_nums($packed_arr) {
        return unpack(PACK_NUMS_FORMAT, $packed_arr);
    }
    function url_embed_array($arr) {
        return url_base64_encode(gzcompress(pack_nums($arr)));
    }
    function url_parse_array($data) {
        return unpack_nums(gzuncompress(url_base64_decode($data)));
    }
    // #####
    $arr = array(7,2,3,4,5,6,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,52,53,54,61);
    $encoded = url_embed_array($arr);
    printf("%d: %s\n", strlen($encoded), $encoded);
    $decoded = url_parse_array($encoded);
    print_r($decoded);
?>