包括PHP中的JavaScript';s json_encode()

包括PHP中的JavaScript';s json_encode(),javascript,php,json,Javascript,Php,Json,我需要使用PHP和json_encode()生成以下脚本 我的尝试如下 <?php $a=array( 'o1'=>123, 'o2'=>array( 'o3'=>456, 'o4'=>'function() {return $( "#myID" ).val();}' ) ); $json=json_encode($a); ?> <script type="text/javascript">

我需要使用PHP和json_encode()生成以下脚本

我的尝试如下

<?php
$a=array(
    'o1'=>123,
    'o2'=>array(
        'o3'=>456,
        'o4'=>'function() {return $( "#myID" ).val();}'
    )
);
$json=json_encode($a);
?>
<script type="text/javascript"> 
    <?php echo("var obj={$json};");?>
    console.log(obj);
</script>

JSON不支持函数。它是一种数据交换格式。也许您应该向下发送一些配置数据,并让函数更改其在该配置上的行为。或者,由于此时您并不是作为AJAX调用来执行此操作,所以只需重复执行即可:

<script type="text/javascript"> 
<?php echo("var obj={$json};");?>
<?php echo("obj.myFunc  = function..."); ?>
console.log(obj);
</script>

控制台日志(obj);

JSON不支持函数。它是一种数据交换格式。也许您应该向下发送一些配置数据,并让函数更改其在该配置上的行为。或者,由于此时您并不是作为AJAX调用来执行此操作,所以只需重复执行即可:

<script type="text/javascript"> 
<?php echo("var obj={$json};");?>
<?php echo("obj.myFunc  = function..."); ?>
console.log(obj);
</script>

控制台日志(obj);

删除围绕函数的引号怎么样

<?php

$obj = array(
    'o1' => 123,
    'o2' => array(
        'o3' => 456,
        'o4' => 'function() {return $( "#myID" ).val();}',
        'o5' => 'function(param) {return $( "#myID" ).val();}'
    )
);
$json = json_encode($obj);

while ($func = strpos($json, '":"function(')) {
    $json = substr($json, 0, $func + 2) . substr($json, $func + 3);
    while ($quote = strpos($json, '"', $func + 2)) {
        $func = $quote + 1;
        if (substr($json, $quote - 1, 1) == "\\") {
            $json = substr($json, 0, $quote - 1) . substr($json, $quote);
            continue;
        }
        $json = substr($json, 0, $quote) . substr($json, $quote + 1);
        break;
    }
}

echo $json;
将此对象设置为变量后,可以看到函数注册良好

这样,您仍然可以使用以前使用的相同技术:

<script type="text/javascript"> 
    <?php echo("var obj={$json};");?>
    console.log(obj);
</script>

控制台日志(obj);

删除围绕函数的引号怎么样

<?php

$obj = array(
    'o1' => 123,
    'o2' => array(
        'o3' => 456,
        'o4' => 'function() {return $( "#myID" ).val();}',
        'o5' => 'function(param) {return $( "#myID" ).val();}'
    )
);
$json = json_encode($obj);

while ($func = strpos($json, '":"function(')) {
    $json = substr($json, 0, $func + 2) . substr($json, $func + 3);
    while ($quote = strpos($json, '"', $func + 2)) {
        $func = $quote + 1;
        if (substr($json, $quote - 1, 1) == "\\") {
            $json = substr($json, 0, $quote - 1) . substr($json, $quote);
            continue;
        }
        $json = substr($json, 0, $quote) . substr($json, $quote + 1);
        break;
    }
}

echo $json;
将此对象设置为变量后,可以看到函数注册良好

这样,您仍然可以使用以前使用的相同技术:

<script type="text/javascript"> 
    <?php echo("var obj={$json};");?>
    console.log(obj);
</script>

控制台日志(obj);

这就是我最后要做的。有点像黑客,我认为Dave的是一个更好的解决方案,但还没有测试过。我会这样做

<?php

class fubar {
    public function json_encode_JS($array)
    {
        $array=$this->_json_encode_JS($array);
        $json=json_encode($array);
        $json=str_replace(array('"%','%"'), '', $json);
        $json=str_replace('\"', '"', $json);
        return $json;
    }
    private function _json_encode_JS($array)
    {
        foreach($array as $key => $value){
            if(is_array($value)){$array[$key]=$this->_json_encode_JS($value);}
            else {
                if(strpos($value, 'function(')===0){
                    $array[$key]='%'.$value.'%';
                }
            }
        }
        return $array;
    }
}

$array=array(
    'o1'=>123,
    'o2'=>'function() {return $("#myID").val();}',
    'o3'=>array(
        'o4'=>456,
        'o5'=>'function() {alert("Hello why don\'t you answer "+$("#myID").val());}'
    )
);

?>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.js" type="text/javascript"></script>
<script type="text/javascript"> 
    <?php
    $obj=new fubar();
    echo('var obj='.$obj->json_encode_JS($array).';');
    ?>
    console.log(obj);
    obj.o3.o5();
</script>
<input id="myID" name="myID" type="text" value="hello">

这就是我最后要做的。有点像黑客,我认为Dave的是一个更好的解决方案,但还没有测试过。我会这样做

<?php

class fubar {
    public function json_encode_JS($array)
    {
        $array=$this->_json_encode_JS($array);
        $json=json_encode($array);
        $json=str_replace(array('"%','%"'), '', $json);
        $json=str_replace('\"', '"', $json);
        return $json;
    }
    private function _json_encode_JS($array)
    {
        foreach($array as $key => $value){
            if(is_array($value)){$array[$key]=$this->_json_encode_JS($value);}
            else {
                if(strpos($value, 'function(')===0){
                    $array[$key]='%'.$value.'%';
                }
            }
        }
        return $array;
    }
}

$array=array(
    'o1'=>123,
    'o2'=>'function() {return $("#myID").val();}',
    'o3'=>array(
        'o4'=>456,
        'o5'=>'function() {alert("Hello why don\'t you answer "+$("#myID").val());}'
    )
);

?>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.js" type="text/javascript"></script>
<script type="text/javascript"> 
    <?php
    $obj=new fubar();
    echo('var obj='.$obj->json_encode_JS($array).';');
    ?>
    console.log(obj);
    obj.o3.o5();
</script>
<input id="myID" name="myID" type="text" value="hello">

您将无法使用json_encode生成JavaScript对象,因为json与JavaScript对象不同。@DaveChen。是否可以使用从数组或对象获取输入的任何内置PHP函数为JavaScript对象创建适当的文本?您将无法使用json_encode生成JavaScript对象,因为json与JavaScript对象不同。@DaveChen。是否可以使用从数组或对象获取输入的任何内置PHP函数为JavaScript对象创建适当的文本?谢谢Daniel。我的实际数组转换为JSON要复杂得多,创建它需要一些操作。我不是试图创建JSON,而是试图创建一个对象(实际上将与以下内容一起使用:)。我已经创建了数组,只是无法回显它。也许需要一些复杂的解析来删除PHP呈现JSON中JavaScript的引号,但这听起来很复杂。谢谢Daniel。我的实际数组转换为JSON要复杂得多,创建它需要一些操作。我不是试图创建JSON,而是试图创建一个对象(实际上将与以下内容一起使用:)。我已经创建了数组,只是无法回显它。也许需要一些复杂的解析来删除PHP呈现的JSON中JavaScript的引号,但这听起来很复杂。谢谢Dave。你的和我的解决方案都能很好地工作,但我喜欢你的,因为它不像我的那样需要多种方法。谢谢Dave。你的和我的解决方案都能很好地工作,但我喜欢你的,因为它不需要像我一样的多种方法。我喜欢这种方法!我已经修改了代码以允许函数中的参数。(搜索
函数(
而不是
函数()
)我可以看到我的方法实际上与你的方法不远。我的方法删除了
“:”函数的第一个双引号(
),并删除所有转义字符,然后删除最后一个未转义的双引号。然而,您可以向任何以
函数开头的字符串添加分隔符
%
,json_encode,然后删除引号和分隔符,然后删除所有转义字符。唯一的问题是,如果有带引号的字符串……它将无法工作。例如,
array('a'=>'hello“world'))
。除此之外,这几乎是一样的。我喜欢这种方法!我已经修改了我的代码以允许函数中的参数。(搜索
函数(
而不是
函数()
)我可以看到我的方法实际上离你的方法不远。我的方法删除了
“:”函数中的第一个双引号(
),并删除所有转义字符,然后删除最后一个未转义的双引号。然而,您可以向任何以
函数开头的字符串添加分隔符
%
,json_encode,然后删除引号和分隔符,然后删除所有转义字符。唯一的问题是,如果您有一个带引号的字符串……它将无法工作。例如,
数组('a'=>'hello“world')
。除此之外,这几乎是一样的。