将php数组值传递为JavaScript数组值

问题描述:

我有一个这样的PHP数组。将php数组值传递为JavaScript数组值

Array 
( 
    [0] => hal([[br,1],[cl,4]]) 
    [1] => alk([[nc(1),1,2],[nc(1),3]]) 
) 

如何传递给JavaScript,如下所示。

var hal=[["br",1],[cl,4]]; 
var alk=[[nc(1),1,2],[nc(1),3]]; 

我写一些代码

<script> 
    var data = <?=json_encode($input);?>; //$input is name of the php array 
    var hal=[data[0].substring(5,data[0].lastIndexOf(']'))]; 
    var alk=[data[1].substring(5,data[1].lastIndexOf(']'))]; 
    document.write(hal[0]); 
</script> 

输出为[BR,1],[CL,1]和我的预期输出就像一个below.Any想法?谢谢。

document.write(hal[0]); => ["br",1] 
document.write(hal[0][0]); => ["br"] 
+0

“我有一个PHP数组像这样”这只是一个字符串数组?如果是这样,可能你可以做得更好,而不是构建一个字符串,你应该建立数据。如果不是,请用有效的数组结构更新问题 - 尝试复制并粘贴'print_r($ input)'的输出;' – miken32

我找到了我的问题的答案。在这里我将PHP的值作为字符串传递。然后将字符串转换为对象。
<?php
$input="hal([[br,1],[cl,4]])";
preg_match('@^([^[]+)?([^)]+)@i',$input, $hal); //get string as '[[br,1],[cl,4]]'
?>

<script>
var hal1 = <?=json_encode($hal[2]);?>; //'[[br,1,2],[cl,1,2]]' pass to javaScript

function toJSObject(str){
str = str.replace(/([a-zA-Z]+)/g, '"$1"');
return (JSON.parse(str))
}
var hal = toJSObject(hal1); // pass to JS object [['br',1,2],['cl',1,2]]
document.write(hal);
</script>
并同时获得这是正确的。
document.write(hal[0]); => ["br",1]
document.write(hal[0][0]); => ["br"]

有一个叫Transform PHP Vars to JavaScript包由Jeffrey方式,你可以用你的变量轻松地转移到你的Javascript。

首先,创建一个实现Laracasts\Utilities\JavaScript\ViewBinder接口。这个类负责将给定的JavaScript插入到您的视图/页面中。

<?php 

class MyAppViewBinder implements Laracasts\Utilities\JavaScript\ViewBinder { 

    // $js will contain your JS-formatted variable initializations 
    public function bind($js) 
    { 
     // Do what you need to do to add this JavaScript to 
     // the appropriate place in your app. 
    } 
} 

接着,把它放在一起:

$binder = new MyAppViewBinder; 
$javascript = new PHPToJavaScriptTransformer($binder, 'window'); // change window to your desired namespace 

$javascript->put(['foo' => 'bar']); 

现在,你可以从你的JavaScript访问window.foo

+0

我事情这种方式有点困难和漫长。我想要一个简单的方法来获得结果。 – Gamsh

+0

如果你不熟悉'interface',那么你应该使用@ miken32。然而,一旦你实现了它,我提供的方式会更好。所以,只要''javascript-> put(['foo'=>'bar']);'并使用'window.foo'从JavaScript中访问它,就像你总是这样做的。在我看来,它更清晰可读。 –

+0

Thanks.Your answer is ok。但我可以找到简单的方法。再次感谢您的回答。 – Gamsh

如果你想要多个变量,你需要遍历数组;你可以抓住名字using a regular expression。如果你想把它变成有效的数据,你可以像JSON字符串一样解析,你将不得不做很多工作;可能无论你从哪里得到这个字符串都是一个更好的地方。让他们传递一个有效的JSON字符串。

<script> 
<?php foreach($input as $v) { 
    preg_match("/(\w+)\((.*)\)/", $v, $matches); 
    $var = $matches[1]; 
    $val = str_replace("'", "\\'", $matches[2]); 
    echo "var $var = '$val';\n"; 
} ?> 
</script> 
+0

这是在'()'括号内的分割值,它也以'[[br,1],[cl,4]]'作为字符串格式。但我希望那些作为数组格式,只有'br' ,'cl'是字符串数字是整数。 – Gamsh

+0

好吧,祝你好运。 – miken32

+0

谢谢你的想法。使用'preg_match'我可以得到我的答案。 – Gamsh