JavaScript — чтение значения оценки, возвращающей массив из PHP-JS

Я недавно начал использовать это PHP-JS библиотека.
Это в основном php-оболочка над движком Google V8 javascript.

Основная причина его использования заключается в том, что он может запускать изолированный код 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}

Но это все еще слишком уродливо, чтобы использовать в реальной жизни

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);

0

Другие решения

Других решений пока нет …