我最近开始使用这个PHP-JS库 它基本上是谷歌的V8 javascript引擎的php包装。
使用它的主要原因是它可以运行隔离的javascript代码 并返回结果。
对int
和string
值没有问题。这些按原样返回。
但我发现自己创建了一个数组,我需要将其返回。 我明白了:
PHP致命错误:无法使用JS \ Object类型的对象作为数组
我正在做这个简单的脚本:
<?php
$context = new JS\Context();
$script = "var arr = ". json_encode([2,3]).";x = arr.length";
var_dump($context->evaluate($script));
// int(2) - which is correct
但是如果我想让arr
返回:
<?php
$script = "var arr = ". json_encode([2,3])."; arr;";
var_dump($context->evaluate($script));
// class JS\Object#1 (0) {}
注意:evaluate($stuff)
返回脚本中的最后一个变量。
有没有很好的方法可以返回该值?
更新:经过一番挖掘,我找到了一种访问数据的方法。它的作用是将数组封装到stdClass
对象中:
$result = $context->evaluate($script);
echo $result->{0}; // outputs 2
// also works for ->{1}
但在现实生活中使用它仍然太难看了
答案 0 :(得分:0)
找出一种提取评估结果array
的方法:
$script = "var arr = ". json_encode([2,3]).";x = JSON.stringify(arr);";
此时,x
是一个字符串:
var_dump($context->evaluate($script)); // string(5) "[2,3]"
现在我需要做的就是'反转'JSON.stringify()
:
var_dump(json_decode($context->evaluate($script),true));
// array(2) {
// [0] => int(2)
// [1] => int(3)
// }
<强>更新强>
以JS\Object
返回的数组可迭代。所以这是有效的:
$script = "var arr = ". json_encode([2,3]).";arr";
foreach($obj as $key=>$val){
print_r($key);echo " => ";print_r($val);echo "\n";
}
// output
// 0 => 2
// 1 => 3
返回数组嵌套时不是很好:
$script = "var arr = ". json_encode([2,3,[1,4]]).";arr";
$obj = $c->evaluate($script);
foreach($obj as $key=>$val){
print_r($key);echo " => ";print_r($val);echo "\n";
}
// output
// 0 => 2
// 1 => 3
// 2 => JS\Object Object() <- this needs looping too
对于第二个示例,需要一个递归方法来解析所有级别。
所以我坚持使用JSON.stringify
和json_decode($r, true)
;