繁体   English   中英

如何在PHP中使用正则表达式或数组索引访问JSON元素

[英]How to access JSON element using regex or array index in PHP

我正在尝试使用PHP读取JSON元素“单位”“值” 但是,某些JSON元素(“ local / sysbench-cpu-1.0.0”,“ m4.4xlarge-4.4.0-66-generic”)在每个JSON中可能并不相同。 这就是为什么我要使用正则表达式或数组索引来访问元素而不是特定字符串的原因:

{
    "title": "cputests-sysbench-cpu-100-m4-4xlarge-20170328",
    "results": {
        "local\/sysbench-cpu-1.0.0": {
            "arguments": "cpu performance benchmark",
            "units": "seconds",
            "results": {
                "m4.4xlarge-4.4.0-66-generic": {
                    "value": "53.2386"
                }
            }
        },
        "": {
            "arguments": "Memory Usage Monitor",
            "units": "Megabytes",
            "results": {
                "m4.4xlarge-4.4.0-66-generic": {
                    "value": "1355,1356,1357,1357,1358,1359,1358,1359,1359,1358,1357,1358,1369,1370,1374,1373,1374,1376,1370,1362,1359,1360,1358,1358,1357,1358,1360,1360,1359,1359,1362,1362,1362,1363,1362,1363,1366,1365,1369,1366,1365,1363,1362,1363,1362,1363,1363,1363,1368,1374,1373,1372,1372,1373"
                }
            }
        }
    }
}

如果我不使用正则表达式或数组索引,则PHP脚本有效:

<?php 
$string = file_get_contents("result.json"); <br>
$data = json_decode($string); <br>
//$data = json_decode($string, true);

//var_dump(json_decode($string)); <br>


print $data->{'results'}->{**'local/sysbench-cpu-1.0.0'**}->units; <br>
print "\n";<br>
print $data->{'results'}->{'local/sysbench-cpu-1.0.0'}->{'results'}->{'**m4.4xlarge-4.4.0-66-generic**'}->value; <br>

// print $data['results']['local/sysbench-cpu-1.0.0']['units']; <br>
// print "\n"; <br>
// print $data['results']['local/sysbench-cpu-1.0.0']['results']['m4.4xlarge-4.4.0-66-generic']['value']; <br>
?>

使用json_decode($string, true)时,任何尝试使用正则表达式代替字符串或数组索引的尝试都将失败。

PHP的JSON解析仅返回普通的旧关联数组或对象。 这些都不支持使用正则表达式作为查找。 如果你坚持使用原生的PHP,你必须foreach通过键和值的方法。

或者,您可能会看一下类似JsonPath的东西,它允许您加载JSON,然后使用看起来非常类似于shell globbing的查询字符串:

$data = ['people' => [['name' => 'Joe'], ['name' => 'Jane'], ['name' => 'John']]];
$result = (new JSONPath($data))->find('$.people.*.name'); // returns new JSONPath

因此,在您的情况下, find()字符串的单位值类似于$.results.*.units ,而值的值为$.results.*.results.*.value 甚至可能有一个更奇特的查询字符串,该字符串将同时返回单位和值。

您可以使用foreach循环foreach results ...

foreach ($json->results as $key => $results) {
  ...
  // access to $results->units

  foreach ($results as $x => $item) {
    ...
    // access to $item->value
  }
}

然后,它们的关键是什么都没有关系。 遵循这些原则。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM