从 PHP-JS 返回数组的计算的读取值


Read value of an evaluation returning an array from PHP-JS

我最近开始使用这个PHP-JS库。
它基本上是谷歌V8 javascript引擎上的php包装器。

使用它的主要原因是它可以运行孤立的javascript代码。
并返回结果。

对于intstring值来说,这都没有问题。这些按原样返回。

但是我发现自己创建了一个数组,我需要返回它。我得到:

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.stringifyjson_decode($r, true);