2017-03-28 3 views
0

PHPを使用して、「単位」および「値」を読み込もうとしています。ただし、一部のJSON要素(「local/sysbench-cpu-1.0.0」、「m4.4xlarge-4.4.0-66-generic」)は、各JSONで同じではない場合があります。私はむしろ、特定の文字列を要素にアクセスするために正規表現や配列のインデックスを使用する理由は次のとおりです。PHPで正規表現または配列インデックスを使用して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)を使用しているときに、文字列または配列インデックスの代わりに正規表現を使用しようとすると失敗します。

+0

なぜ正規表現を使用しますか? 'json_decode'が完璧にうまく動作すれば。 – Vallentin

答えて

0

あなたは彼らがされているキーかは重要ではありませんresults ...

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

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

の上に行くためにforeachループを使用することができます。それらの線に沿って何か。

+0

これはもちろん、これがあなたが持つデータ構造であることを前提としています。 – sebi

+0

2番目のforeachは機能しません。私が正しく使用しているかどうかはわかりません。私はそれをネストされたloop.foreachとして使用しています($ data - > {'results'} $ key => $ results){ echo $ results-> units; foreach($ results = $ x => $ item){ echo $ item-> value; } } – user2464401

0

PHPのJSON解析では、単純な古い連想配列またはオブジェクトのみが返されます。これらのどちらもルックアップとして正規表現を使用しません。ネイティブPHPの使用を主張する場合は、foreachキーと値を使用する必要があります。

それとも、あなたはJSONをロードすることができますJsonPathのようなものを見て、その後、シェルグロブに非常に近い見えますクエリ文字列使用することがあります:あなたのケースでそう

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

を、あなたのfind()の文字列は、単位値の場合は$.results.*.units、値の場合は$.results.*.results.*.valueとなります。おそらく、単位と値の両方を同時に返すクエリ文字列がさらに派手なものになっているでしょう。

関連する問題