0

多次元配列を単純なテーブルとして出力する方法を探しています。

ここで利用可能なxmlhttp://google.com/complete/search?output=toolbar&q=adamを単純な関数で処理することで取得しました

function convertXmlObjToArr($obj) { 
$json = json_encode($obj);
$array = json_decode($json,TRUE);

return $array;

}

配列を取得しました

   array(1){ ["CompleteSuggestion"]=>
  array(10) {
    [0]=>
    array(1) {
      ["suggestion"]=>
      array(1) {
        ["@attributes"]=>
        array(1) {
          ["data"]=>
          string(12) "adam sandler"
        }
      }
    }
    [1]=>
    array(2) {
      ["suggestion"]=>
      array(1) {
        ["@attributes"]=>
        array(1) {
          ["data"]=>
          string(11) "adam levine"
        }
      }
      ["num_queries"]=>
      array(1) {
        ["@attributes"]=>
        array(1) {
          ["int"]=>
          string(8) "33200000"
        }
      }
    }
    [2]=>
    array(2) {
      ["suggestion"]=>
      array(1) {
        ["@attributes"]=>
        array(1) {
          ["data"]=>
          string(12) "adam carolla"
        }
      }
      ["num_queries"]=>
      array(1) {
        ["@attributes"]=>
        array(1) {
          ["int"]=>
          string(7) "5570000"
        }
      }
    }
    [3]=>
    array(2) {
      ["suggestion"]=>
      array(1) {
        ["@attributes"]=>
        array(1) {
          ["data"]=>
          string(12) "adam lambert"
        }
      }
      ["num_queries"]=>
      array(1) {
        ["@attributes"]=>
        array(1) {
          ["int"]=>
          string(8) "45400000"
        }
      }
    }
    [4]=>
    array(1) {
      ["suggestion"]=>
      array(1) {
        ["@attributes"]=>
        array(1) {
          ["data"]=>
          string(17) "adam sandler died"
        }
      }
    }
    [5]=>
    array(2) {
      ["suggestion"]=>
      array(1) {
        ["@attributes"]=>
        array(1) {
          ["data"]=>
          string(19) "adam sandler movies"
        }
      }
      ["num_queries"]=>
      array(1) {
        ["@attributes"]=>
        array(1) {
          ["int"]=>
          string(8) "43600000"
        }
      }
    }
    [6]=>
    array(2) {
      ["suggestion"]=>
      array(1) {
        ["@attributes"]=>
        array(1) {
          ["data"]=>
          string(13) "adam morrison"
        }
      }
      ["num_queries"]=>
      array(1) {
        ["@attributes"]=>
        array(1) {
          ["int"]=>
          string(8) "13800000"
        }
      }
    }
    [7]=>
    array(2) {
      ["suggestion"]=>
      array(1) {
        ["@attributes"]=>
        array(1) {
          ["data"]=>
          string(10) "adams golf"
        }
      }
      ["num_queries"]=>
      array(1) {
        ["@attributes"]=>
        array(1) {
          ["int"]=>
          string(8) "30500000"
        }
      }
    }
    [8]=>
    array(2) {
      ["suggestion"]=>
      array(1) {
        ["@attributes"]=>
        array(1) {
          ["data"]=>
          string(10) "adam yauch"
        }
      }
      ["num_queries"]=>
      array(1) {
        ["@attributes"]=>
        array(1) {
          ["int"]=>
          string(8) "19700000"
        }
      }
    }
    [9]=>
    array(2) {
      ["suggestion"]=>
      array(1) {
        ["@attributes"]=>
        array(1) {
          ["data"]=>
          string(9) "adam west"
        }
      }
      ["num_queries"]=>
      array(1) {
        ["@attributes"]=>
        array(1) {
          ["int"]=>
          string(9) "137000000"
        }
      }
    }
  }
}

今、私はそれを出力して、2つの問題に直面したいと思います:

  1. このように構造化された配列の関連情報(「data」と「int」)を「掘り下げる」にはどうすればよいですか?これまでのところ、私ははるかに単純な配列を扱っていました(それほど「深く」はありません)。私はforeachループを介してそれをしようとしています

foreach($ googleKeywords-> CompleteSuggestion as $ Suggestion){

echo"{$this->suggestion->data}"; }

ただし、「非オブジェクトのプロパティを取得しようとしています」というエラーが発生し続けます。

  1. 一部のデータが完全ではないことに気付いたように、「data」には名前がありますが、対応する「int」にはありません...「int」が設定されていないかどうかにかかわらず、「nodata」をエコーする方法はありますか?

ではごきげんよう、

アダム

4

2 に答える 2

1

あなたはこれを試すことができます(コードが更新されました)

foreach($googleKeywords['CompleteSuggestion'] as $suggestion){
    if (count($suggestion) == 2) {
        echo $suggestion['suggestion']['@attributes']['data'];
        echo $suggestion['num_queries']['@attributes']['int'];
    }
}

これにより、少なくとも配列の要素にアクセスする方法についてのアイデアが得られるはずです。

出力のフォーマットはあなたに任せます。

このifステートメントは、すべてのデータが設定されていることを確認します(dataとintの両方の2つの項目が必要です)。else{}「データが設定されていません」をエコーするセクションを作成できます。for要素の数がわからないため、ループが必要です。このスタイルのループは、forそれでうまくいきます。1つしかない場合でも、9つしかない場合でも、配列内のすべての要素をループします。配列にゼロ要素がある場合、forループはスキップされます。

お役に立てれば。

于 2012-09-10T05:09:19.547 に答える
0

ありがとう、

動作した最終的なコードはネストされたループを含み、次のとおりです。

<pre>foreach($keywords as $suggestion){
 foreach ($suggestion as $finalSuggestion){
   echo "<p>".$finalSuggestion['suggestion']['@attributes']['data']."</p>";
   echo $finalSuggestion['num_queries']['@attributes']['data']."<br/>";
    if (array_key_exists('num_queries', $finalSuggestion)) {
    echo "<p> ".$finalSuggestion['num_queries']['@attributes']['int']." </p>";
    }
    else
        {
        echo "<p>no data</p> ";
    }
     }

}
</pre>  

PS。コードのフォーマットがひどいので申し訳ありませんが、ここでそれを正しく行う方法がまだわかりません....私は通常<pre>を置くだけですが、今はワイルドになります...。

于 2012-09-12T01:19:29.507 に答える