读取从PHP-JS返回数组的评估值

时间:2016-03-15 15:47:08

标签: javascript php arrays copernica-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}

但在现实生活中使用它仍然太难看了

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