2012-04-28 9 views
2

ここで(以下に示す)、私がやっている多次元配列のパースを行う非常に簡単なPHPです。私はちょうど '強調表示'キーを探して、別の配列にいくつかのキーの値のペアを格納しています。あなたが望むものに到達するためにn個のforeachループを持つのではなく、これを達成するためのよりよい方法がありますか(パフォーマンスに関して)。ここでPHP多次元配列の解析

$json_O=json_decode(file_get_contents($url),true); 
    foreach($json_O as $section1=>$items1){ 
     if($section1==highlighting){ 
      foreach($items1 as $section2=>$items2){ 
        $key=$section2; 
        foreach($items2 as $section3=>$items3){ 
         foreach ($items3 as $section4=>$items4){ 
          $value=$items4; 
          $found[]=array('Key' => $key, 'Value' => $value); 

は、私が解析しようとしているサンプルのPHPオブジェクトです:今

Array 
(
    [responseHeader] => Array 
     (
      [status] => 0 
      [QTime] => 3 
      [params] => Array 
       (
        [indent] => on 
        [start] => 0 
        [q] => russian 
        [fragsize] => 40 
        [hl.fl] => Data 
        [wt] => json 
        [hl] => on 
        [rows] => 8 
       ) 

     ) 

    [response] => Array 
     (
      [numFound] => 71199 
      [start] => 0 
      [docs] => Array 
...... 
...... 
    [highlighting] => Array 
     (
      [114360] => Array 
       (
        [Data] => Array 
         (
          [0] => AMEki has done it better <em>russian</em>... 

.... 
.... 

2つのこと:1)私は速くそれを行うことができますか? 2)私はそれをより良く設計できますか?

答えて

5

これは私が希望、これは

$riter = new RecursiveArrayIterator($json_O['highlighting']); 
$riteriter = new RecursiveIteratorIterator($riter, RecursiveIteratorIterator::LEAVES_ONLY); 
$found = array(); 
foreach ($riteriter as $key => $value) { 
    $key = $riteriter->getSubIterator($riteriter->getDepth() - 2)->key(); 
    $found[] = compact('key', 'value'); 
} 

個人的にテストされていませんが、あなたは、単に、残りを簡素化

 foreach($json_O['highlighting'] as $section2=>$items2){ 

も可能です行うことができ

foreach($json_O as $section1=>$items1){ 
    if($section1==highlighting){ 
     foreach($items1 as $section2=>$items2){ 

unneccesaryようですちょうどnを使うforeachループを評価しました。再帰的イテレータを創造的に使用するのではなく、わかりやすいです。

+0

素晴らしいクリス。ありがとう!!! –

2
foreach($json_O['highlighting'] as ...) { 
    ... 
} 

それは今、通常のPHPの配列されているので、それはJSONから来たという理由だけで、あなたは通常のPHP配列としてアクセスすることはできませんという意味ではありません。

0

一部のベンチマークでは、ではなく、for(;;)ループのパフォーマンスが向上しています。 とあなたがすべてのアイテムを取得する必要があるときはもちろん配列要素への直接アクセスが非常に速く

+2

マイクロ最適化は良い考えではないと思いますか? – llamerr

+0

idk、彼はもっと速くすることができるかと尋ねている) – heximal

+0

彼は質問を明確にしていないまで、それは答えである。8) – llamerr

1

使用しますforeachです。 highlightingだけの場合は、直接アクセスしてください。

$higlighting = $json_0['highlighting']; 
foreach($highlightis as $Key => $value) { 
//.... 
}