ExtJS: PHP DecodeValue

3 Cevap php

Ben de, PHP bir decodeValue() fonksiyonunu zevk verebilecek herhangi bir yolu var mı? Ben bir PHP dosyası için bu encodedValue değerleri gönderme ve ben bir dizi olarak PHP onlarla çalışmak gerekir.

Nasıl Ext kodlanmış devletten bir PHP dizi falan ile sona erebilir? Ya da, ben kolayca PHP onları okumak mümkün kodlanmış değerleri işe yarayabilir başka bir yolu var mı? Burada fonksiyon kodu:

decodeValue : function(cookie){
        var re = /^(a|n|d|b|s|o)\:(.*)$/;
        var matches = re.exec(unescape(cookie));
        if(!matches || !matches[1]) return; // non state cookie
        var type = matches[1];
        var v = matches[2];
        switch(type){
            case "n":
                return parseFloat(v);
            case "d":
                return new Date(Date.parse(v));
            case "b":
                return (v == "1");
            case "a":
                var all = [];
                var values = v.split("^");
                for(var i = 0, len = values.length; i < len; i++){
                    all.push(this.decodeValue(values[i]));
                }
                return all;
           case "o":
                var all = {};
                var values = v.split("^");
                for(var i = 0, len = values.length; i < len; i++){
                    var kv = values[i].split("=");
                    all[kv[0]] = this.decodeValue(kv[1]);
                }
                return all;
           default:
                return v;
        }
    }

Teşekkür ederim.

3 Cevap

Aşağıda PHP benim limanıdır. Bu yakın PHP eşdeğer olarak ben tarihi yerine DateTime sınıfı kullanılır, ama aynı zamanda bir Unix zaman damgası almak için () strftime kullanın, ya da ne olursa olsun yöntemi tercih olabilir. Ayrıca, 'o' türü için ben nesnenin parametre adları anahtarlı bir dizi yerine bir nesne, geri dönmek.

İşte kod:

function decodeValue($cookie) {
    $cookie = urldecode($cookie);
    $re = '/^(a|n|d|b|s|o)\:(.*)$/';
    $matches = array();
    preg_match($re, $cookie, $matches);
    if(!$matches || !$matches[1]) return; // non state cookie
    $type = $matches[1];
    $v = $matches[2];
    switch ($type){
        case "n":
            return floatval($v);
        case "d":
            return new DateTime($v);
        case "b":
            return ($v == "1" ? true : false);
        case "a":
            $all = array();
            $values = explode('^', $v);
            $len = count($values);
            for ($i = 0; $i < $len; $i++) {
                $all.push(decodeValue($values[$i]));
            }
            return $all;
       case "o":
            $all = array();
            $values = explode('^', $v);
            $len = count($values);
            for($i = 0; $i < $len; $i++){
                $kv = explode('=', $values[$i]);
                $all[$kv[0]] = decodeValue($kv[1]);
            }
            return $all;
       default:
            return $v;
    }
}

Kodunda bir hata düzeltildi. Şimdi ikinci düzey / üçüncü basamak dizisi düzgün çalışmalıdır.

function decodeValue($cookie) {
    $cookie = urldecode($cookie);
    $re = '/^(a|n|d|b|s|o)\:(.*)$/';
    $matches = array();
    preg_match($re, $cookie, $matches);
    if(!$matches || !$matches[1]) return $cookie; // non state cookie
    $type = $matches[1];
    $v = $matches[2];

    switch ($type){
        case "n":
            return floatval($v);
        case "d":
            return new DateTime($v);
        case "b":
            return ($v == "1" ? true : false);
        case "a":
            $all = array();
            $values = explode('^', $v);
            $len = count($values);
            for ($i = 0; $i < $len; $i++) {
                $all.array_push(decodeValue($values[$i]));
            }
            return $all;
       case "o":
            $all = array();
            $values = explode('^', $v);
            $len = count($values);
            for($i = 0; $i < $len; $i++){
                $kv = explode('=', $values[$i],2);
                if(count($kv)==1){
                    $all[] = decodeValue($kv[0]);
                }else{
                    $all[$kv[0]] = decodeValue($kv[1]);
                }
            }
            return $all;
       default:
            return $v;
    }
}
$all.array_push(decodeValue($values[$i]));

ile değiştirilmesi gerekir

$all[] = decodeValue($values[$i]);