/ / Valor de lectura de una evaluación que devuelve una matriz desde PHP-JS - javascript, php, arrays, copernica-php-js

Valor de lectura de una evaluación que devuelve una matriz de PHP-JS - javascript, php, arrays, copernica-php-js

He empezado a usar esto recientemente PHP-JS biblioteca.
Es básicamente una envoltura de PHP sobre el motor javascript V8 de Google.

La razón principal de usarlo es que puede ejecutar código javascript aislado.
Y devolver el resultado.

No es problema para int y string valores. Esos son devueltos como están.

Pero me encontré creando una matriz y necesito devolverla. Yo obtengo:

Error grave de PHP: no se puede utilizar el objeto de tipo JSObject como matriz

Estoy haciendo este simple script:

<?php
$context = new JSContext();
$script = "var arr = ". json_encode([2,3]).";x = arr.length";
var_dump($context->evaluate($script));
// int(2) - which is correct

Pero si quiero conseguir el arr devuelto

<?php
$script = "var arr = ". json_encode([2,3])."; arr;";
var_dump($context->evaluate($script));
// class JSObject#1 (0) {}

Nota: evaluate($stuff) devuelve la última variable en el script.

¿Hay alguna buena manera de devolver ese valor?


Actualización: Después de algunas excavaciones, encontré una manera de acceder a los datos. Lo que hace es encapsular la matriz en un stdClass objeto:

$result = $context->evaluate($script);
echo $result->{0}; // outputs 2
// also works for ->{1}

Pero todavía es demasiado feo para usar en la vida real

Respuestas

0 para la respuesta № 1

Descubrí una manera de extraer array Resultados de la evaluación:

$script = "var arr = ". json_encode([2,3]).";x = JSON.stringify(arr);";

En este punto, x es una cadena:

var_dump($context->evaluate($script)); // string(5) "[2,3]"

Ahora todo lo que necesito hacer es "revertir" el JSON.stringify():

var_dump(json_decode($context->evaluate($script),true));
// array(2) {
//   [0] => int(2)
//   [1] => int(3)
// }

Actualizar


Arrays devueltos como JSObject son iterable Así que esto es válido:

$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

No es tan agradable cuando la matriz de retorno está anidada:

$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 => JSObject Object() <- this needs looping too

Para el segundo ejemplo, se requiere un método recursivo para analizar todos los niveles.

Así que me quedo con el JSON.stringify y json_decode($r, true);