Php 使用JSONPath在数组中设置值

Php 使用JSONPath在数组中设置值,php,json,jsonpath,Php,Json,Jsonpath,我试图使用JSONPath()的PHP实现来处理一些解码的json数据 我可以使用表达式在解码的JSON中查找数据,但我希望能够使用JSONPath表达式设置数据。有没有人能够在PHP中使用JSONPath实现这一点,如果有,如何实现?简单看一下文档,JSONPath似乎不支持集合操作。如果有人这么想的话,我可以想象,您可以修改JSONPath,选择返回一个指针数组(即对象引用),作为resultType,这样您就可以直接对值进行操作。简单看一下文档,JSONPath似乎不支持集合操作。如果有人

我试图使用JSONPath()的PHP实现来处理一些解码的json数据


我可以使用表达式在解码的JSON中查找数据,但我希望能够使用JSONPath表达式设置数据。有没有人能够在PHP中使用JSONPath实现这一点,如果有,如何实现?

简单看一下文档,JSONPath似乎不支持集合操作。如果有人这么想的话,我可以想象,您可以修改JSONPath,选择返回一个指针数组(即对象引用),作为
resultType
,这样您就可以直接对值进行操作。

简单看一下文档,JSONPath似乎不支持集合操作。如果有人这么想的话,我可以想象,您可以修改JSONPath,有选择地将指针数组(即对象引用)作为
resultType
返回,这样您就可以直接对值进行操作。

JSONPath的这个实现似乎不支持set操作

我已经编写了一个简单的函数,可以将其添加到jsonPath.php以添加此功能。我已将其粘贴在此处,以防对其他人有用:

/**
 * @param array  $obj       Decoded json file to alter
 * @param string $expr      JSONPath expression (http://goessner.net/articles/JsonPath/)
 * @param mixed  $value     Value to set all matching entries to
 */
function jsonPathSet(&$obj, $expr, $value)
{
    $paths = jsonPath($obj, $expr, array('resultType' => 'PATH'));
    $jsonPath = new JsonPath();

    foreach ($paths as $path) {
        $p = $jsonPath->normalize($path);
        $keys = explode(';', $p);

        $current = &$obj;
        foreach ($keys as $key) {
            if($key=='$') {
                continue;
            } else if (is_array($current)) {
                $current = &$current[$key];
            } else {
                $current = &$current->$key;
            }
        }
        $current = $value;
    }
}

感谢迈克·布兰特的建议

这个JSONPath实现似乎不支持set操作

我已经编写了一个简单的函数,可以将其添加到jsonPath.php以添加此功能。我已将其粘贴在此处,以防对其他人有用:

/**
 * @param array  $obj       Decoded json file to alter
 * @param string $expr      JSONPath expression (http://goessner.net/articles/JsonPath/)
 * @param mixed  $value     Value to set all matching entries to
 */
function jsonPathSet(&$obj, $expr, $value)
{
    $paths = jsonPath($obj, $expr, array('resultType' => 'PATH'));
    $jsonPath = new JsonPath();

    foreach ($paths as $path) {
        $p = $jsonPath->normalize($path);
        $keys = explode(';', $p);

        $current = &$obj;
        foreach ($keys as $key) {
            if($key=='$') {
                continue;
            } else if (is_array($current)) {
                $current = &$current[$key];
            } else {
                $current = &$current->$key;
            }
        }
        $current = $value;
    }
}

感谢迈克·布兰特的建议

谢谢,这是我所怀疑的,但我希望不是这样!我会看看是否可以尝试更新它。@JMac或者,也可以在库中实现一个更强大的强制集方法。老实说,它最终可能与构建一组引用并针对该引用进行操作的性能类似或更好。为这些建议喝彩,我在另一个答案中发布了一个解决方案。谢谢,这是我所怀疑的,但我希望不是这样!我会看看是否可以尝试更新它。@JMac或者,也可以在库中实现一个更强大的强制集方法。老实说,它最终可能与构建一组引用然后针对该引用进行操作的性能类似或更好。为这些建议干杯,我在另一个答案中发布了一个解决方案。很高兴看到您提出了一个解决方案。您可以考虑将其作为JSONPATH对象本身的方法添加,并将其提交给Labalu维护人员,以供将来使用。如果有像
$jsonPath->set($expr,$value)
这样的东西作为对当前jsonPath对象进行操作的方法签名,那就太好了。很高兴看到您提出了一个解决方案。您可以考虑将其作为JSONPATH对象本身的方法添加,并将其提交给Labalu维护人员,以供将来使用。最好将
$jsonPath->set($expr,$value)
之类的内容设置为方法签名,该签名将在当前jsonPath对象上操作。