2012-04-28 2 views
2

여기 (아래 주어진) 내가하고있는 다차원 배열 물건을 구문 분석하는 아주 간단한 PHP입니다. 나는 단지 '강조 표시'키를 검색하고 다른 배열에 키 값 쌍을 저장하고 있습니다. 이를 달성하기위한 더 좋은 방법은 (성능과 관련하여) 의미가 있습니다. 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>... 

.... 
.... 

두 가지를 지금 : 1) 나는 빨리 그것을 할 수 있습니까? 2) 더 잘 디자인 할 수 있습니까? 이 JSON에서 왔기 때문에

답변

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을 사용하십시오. ested foreach 루프. 재귀 적 반복자를 창의적으로 사용하는 것은 쉽지 않지만 이해하기 쉽습니다.

+0

환상적인 크리스. 감사!!! –

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

그냥 이제 정상적인 PHP 배열입니다 때문에, 일반적인 PHP 배열로 액세스 할 수 없습니다 의미하지는 않습니다.

0

일부 벤치 마크는 이 아닌 for(;;) 루프의 성능이 더 우수함을 보여줍니다. 하고 모든 항목에 도착해야 할 때 당연히 배열 요소에 대한 직접 액세스는 매우 빠른

+2

마이크로 최적화가 좋은 생각이라고 생각하지 않습니까? – llamerr

+0

idk, 그가 더 빨리 할 수 ​​있는지 묻는 중입니다. – heximal

+0

글쎄, 질문을 명확히하지 않을 때까지 대답입니다. 8) – llamerr

1

사용 foreach는 것입니다. highlighting 만 원한다면 직접 액세스하십시오.

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