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 № 1Descubrí 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)
;