我最近开始使用这个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}
但它仍然太丑陋了,无法在现实生活中使用。
想出一种方法来提取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)
;