如何使用PHP

时间:2017-03-28 23:30:46

标签: php arrays json regex

我正在尝试使用PHP阅读JSON元素" unit" " value" 。但是,一些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)时尝试使用正则表达式代替字符串或数组索引失败。

2 个答案:

答案 0 :(得分:0)

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。可能有一个更加漂亮的查询字符串,可以同时返回单位和值。

答案 1 :(得分:0)

您可以使用<button type="submit" class="btn btn-primary" ng-click="vm.saveProduct()">Save</button> <button type="button" data-dismiss="modal" class="btn btn-default" ng-click="vm.closeForm()">Cancel</button> 循环查看foreach ...

results

然后关键是什么并不重要。这些方面的东西。