1

オブジェクトと配列に html_entity_decode を適用する関数を構築しようとしています。事前に構造がわからず、子プロパティもオブジェクトまたは配列になる可能性があるため、単純な再帰関数が適しているようです。以下が機能しない理由がわかりません。

function decode($data){  
    if(is_object($data) || is_array($data)){
        foreach($data as &$value)
            $value = $this->decode($value);
    }
    else $data = html_entity_decode($data);

    return $data;
}

次のことも試しましたが、どちらも機能しません。

function decode($data){
    if(is_object($data))
        $data = get_object_vars($data);

    $data = is_array($data) ? array_map(array('MyClassName', 'decode'), $data) : html_entity_decode($data);

    return $data;
}

どちらの関数もデータには影響しません。私は何を間違っていますか?

4

3 に答える 3

9

主な問題は、配列のようなオブジェクトを操作しようとしているということですis_object($data) || is_array($data)objectarray

その他の問題は、変数名が正しくなく、適切な変数を返さないことに基づいています。試すことができます

$std = new stdClass();
$std->title = array("x" => "<a>XXX</a>","y" => "<b>YYY</b>");
$std->body = "<p> THis is the Body </p>";

$var = array(
        "a" => "I'll \"walk\" the <b>dog</b> now",
        "b" => array("<b>Hello World</b>",array(array("Yes am <strong> baba </strong>"))),
        "c" => $std

);

$class = new MyClassName();
$encode = $class->encode($var); // encode 
$decode = $class->decode($encode);  // decode it back

print_r($encode);
print_r($decode);

エンコードされた配列

Array
(
    [a] => I'll &quot;walk&quot; the &lt;b&gt;dog&lt;/b&gt; now
    [b] => Array
        (
            [0] => &lt;b&gt;Hello World&lt;/b&gt;
            [1] => Array
                (
                    [0] => Array
                        (
                            [0] => Yes am &lt;strong&gt; baba &lt;/strong&gt;
                        )

                )

        )

    [c] => stdClass Object
        (
            [title] => Array
                (
                    [x] => &lt;a&gt;XXX&lt;/a&gt;
                    [y] => &lt;b&gt;YYY&lt;/b&gt;
                )

            [body] => &lt;p&gt; THis is the Body &lt;/p&gt;
        )

)

デコードされた配列

Array
(
    [a] => I'll "walk" the <b>dog</b> now
    [b] => Array
        (
            [0] => <b>Hello World</b>
            [1] => Array
                (
                    [0] => Array
                        (
                            [0] => Yes am <strong> baba </strong>
                        )

                )

        )

    [c] => stdClass Object
        (
            [title] => Array
                (
                    [x] => <a>XXX</a>
                    [y] => <b>YYY</b>
                )

            [body] => <p> THis is the Body </p>
        )

)

ライブデモを見る

class MyClassName {
    function encode($data) {
        if (is_array($data)) {
            return array_map(array($this,'encode'), $data);
        }
        if (is_object($data)) {
            $tmp = clone $data; // avoid modifing original object
            foreach ( $data as $k => $var )
                $tmp->{$k} = $this->encode($var);
            return $tmp;
        }
        return htmlentities($data);
    }

    function decode($data) {
        if (is_array($data)) {
            return array_map(array($this,'decode'), $data);
        }
        if (is_object($data)) {
            $tmp = clone $data; // avoid modifing original object
            foreach ( $data as $k => $var )
                $tmp->{$k} = $this->decode($var);
            return $tmp;
        }
        return html_entity_decode($data);
    }
}
于 2013-02-28T21:27:17.390 に答える
1

正確に何をしたいですか: 既存の値を html エンティティのデコードされた値に置き換えるか、データ構造全体のコピーをエンコードされた値で作成しますか?

置き換えたい場合は、参照によって関数引数を渡す必要があります。

function decode( &$data ){

コピーを作成したい場合は、そのままで動作するはずです (または、「次は動作しません」とはどういう意味かを正確に説明してください)。

于 2013-03-03T01:43:12.267 に答える
0

array-walk-recursive はどうですか: http://php.net/manual/en/function.array-walk-recursive.php おそらく次のようなものです:

function decode($data){  
    $data = html_entity_decode($data);
}
function decode_data($data){
    if(is_object($data) || is_array($data)){
       array_walk_recursive($data, 'decode');
    }else{
       $data = html_entity_decode($data);
    }
    return $data;
}
于 2013-02-13T19:42:37.157 に答える