Я недавно начал использовать это 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}
Но это все еще слишком уродливо, чтобы использовать в реальной жизни
Выяснили способ извлечения 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)
;
Других решений пока нет …