2012-04-28 157 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)我可以更好地设计吗?

回答

5

这似乎unneccesary

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

,你可以简单地做

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

简化休息也是可能的,虽然这是未经测试

$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'); 
} 

个人而言,我会只用n但是,尽管有foreach循环。这很容易理解,而我的递归迭代器的创造性使用不是。

+0

奇妙的克里斯。谢谢!!! – 2012-04-28 16:31:53

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

只是因为它从JSON来了并不意味着你不能访问它作为一个正常的PHP数组,因为它IS正常的PHP数组现在。

0

一些基准测试显示for(;;)循环的性能更好,而不是foreach()。 当然数组元素的直接访问是相当快

+2

我不认为微优化是一个好主意吗? – llamerr 2012-04-28 15:31:04

+0

idk,他问,如果他能做得更快) – heximal 2012-04-28 15:44:17

+0

那么,这是一个答案,然后,直到他没有澄清他的问题8) – llamerr 2012-04-28 15:57:23

1

使用的foreach,当你需要去每个项目。如果你只想要highlighting,那么只需直接访问它。

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