3

ここに(以下に示す)、私が行っている非常に単純なphp解析多次元配列のものがあります。'highlighting'キーを検索し、いくつかのキーと値のペアを別の配列に格納しています。これを達成するためのより良い方法はありますか(つまり、パフォーマンスに関して)、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>...

....
....

今2つのこと: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 に答える