3

这里(如下所示)是我正在做的一些非常简单的 php 解析多维数组的东西。我只是在搜索“突出显示”键,然后将一些键值对存储在另一个数组中。有没有更好的方法来实现这一点(我的意思是关于性能),而不是有 n 个 foreach 循环来达到你想要的。

$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)我可以设计得更好吗?

4

4 回答 4

6

这似乎是不必要的

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

就个人而言,我只会使用嵌套的 foreach 循环。这很容易理解,而我创造性地使用递归迭代器则不然。

于 2012-04-28T15:40:37.670 回答
2
foreach($json_O['highlighting'] as ... ) {
   ...
}

仅仅因为它来自 json 并不意味着你不能将它作为一个普通的 PHP 数组来访问,因为它现在一个普通的 php 数组。

于 2012-04-28T15:27:56.317 回答
1

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

$higlighting = $json_0['highlighting'];
foreach($highlightis as $Key => $value) {
 //....
}
于 2012-04-28T15:34:44.757 回答
0

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

于 2012-04-28T15:29:45.330 回答